一、DataSource 對象
1. 什么是DataSource對象
DataSource對象是javax.sql包中的一個接口,其實就是可以標識為一個數據庫連接資源,數據源對象里面應該存儲連接的url,用戶名和密碼等連接信息。
在使用JDBC連接數據庫的時候,都使用通過DriverManager進行獲取Connection對象,getConnection方法都需要傳遞url,name.passwd等信息,其實這些信息就是可以充當一個數據源對象。
2. 數據源和數據連接池的區別
數據源就是一個數據的來源,相當於數據庫。但是程序去訪問數據庫並不直接訪問,會通過一個代理,也就是數據連接池,每一個數據連接池引用的對象肯定有數據源。DataSource的實現子類有很多,其中很多第三方的連接池都是需要實現DataSource的,如果創建一個帶數據池的數據源,則就有連接池功能了。
比如:Mybatis就有默認的數據源實現類
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://172.23.23.166:3306/DB_ATY?characterEncoding=UTF-8&allowMultiQueries=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
在mybatis-config配置數據源的時候,就可以指定type為POOLED\UNPOOLED\JNDI
3. druid連接池
比如現在項目中使用的數據源連接池為:DruidDataSource。
Druid是阿里開源的數據庫連接池,性能比C3P0\DBCP更高,提供監控功能,可以監聽sql語句的執行時間、ResultSet持有時間、返回行數、更新行數、分析SQL的執行性能。
durid有如下參數用於來配置數據庫連接池信息。
- iniitialSize 初始化連接數,比如初始化10個連接
- minidle 最小連接數也10個,應該和初始化保持一致,如果初始化的時候要瘋狂連接數據庫則初始化的時候可以開大點
- maxActve 最大連接數,應該和最大並發量保持一致吧
- maxWait 應該盡量保持再一分鍾,不能太長,不讓給用戶不好的體驗
- validationQuery
現在一直不知道連接池的一些參數應該配置多少,有時間再去了解。
二、Spring是如何管理DataSource對象的
其實我理解的是,spring就將DataSource作為一個bean對象而且,你可以在spring項目中聲明多個datasource對象。管理的話主要還是得看spring如何跟mybatis等一些需要數據連接池的框架是如何進行交互。
-
在springboot中如何聲明一個DataSource對象?
spring: datasource: type:xxx url:xxx username:xxx password:xxx
直接在application.yml編寫這樣的聲明,springboot則會自動注入一個dataSource的bean對象,但是如果需要使用多數據源的話,則不能這樣寫,並且需要手動配置生成DataSource對象。
-
多數據源應該如何創建DataSource對象?
@Bean(name = "dmDatasourceProperties")
@Qualifier("dmDatasourceProperties")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.xx")
public DataSourceProperties xxDatasourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "xxDatasource")
@Qualifier("xxDatasource")
@Primary
public DataSource xxDatasource() {
return xxDatasourceProperties().initializeDataSourceBuilder().build();
}
這樣就配置好了對應的name的數據源了
- jdbcTemplate選擇對應的數據庫源
比如使用JdbcTemplate,JdbcTemplate是一個已經封裝好的對象,但是一開始肯定沒有注入到spring容器中(如果有默認的數據庫源的話可能也注入進去了),應該創建JdbcTemplate對象注入到spring容器中,這個時候就需要一個DataSource數據源了。
@Bean(name = "jdbcTemplate")
public JdbcTemplate getJdbc(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(xxDatasource());
return jdbcTemplate;
}