DataSource对象的理解
一、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;
}