前言
Springboot默认支持3种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是:
org.apache.tomcat.jdbc.pool.DataSource(1.x版本默认)
com.zaxxer.hikari.HikariDataSource(2.x版本默认)
org.apache.commons.dbcp2.BasicDataSource
对于这3种数据源,当 classpath 下有相应的类存在时,Springboot 会通过自动配置为其生成DataSource Bean,DataSource Bean默认只会生成一个,三种数据源类型的生效先后顺序如下:Tomcat -> Hikari -> Dbcp2 。
1、默认配置:
默认yaml配置 不指定数据源
spring:
datasource:
username:root
password:root
url:jdbc:mysql://localhost:3306/test
driver-class-name:com.mysql.jdbc.Driver
将使用springboot默认的数据源
位置:org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
默认以下三种数据源
org.apache.tomcat.jdbc.pool.DataSource
com.zaxxer.hikari.HikariDataSource
org.apache.commons.dbcp2.BasicDataSource
2、自定义数据源类型
源码如下
/**
* Generic DataSource configuration.
*/
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
因此 我们只需要在配置文件中spring.datasource下指定type即可
接下来演示自定义数据源类型为Druid
3、整合Druid数据源
首先引入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.14</version>
</dependency>
当然这里可以直接引入druid-spring-boot-starter但为了解其原理 这里直接引入非starter的依赖
1) 初始化一个我们自己的数据源
@Configuration
publicclassDruidConfig{
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource druidDataSource(){
return new DruidDataSource();
}
//配置druid监控访问的servlet
@Bean
public ServletRegistration BeanduridServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
Map<String,String>map=newHashMap<>();
map.put("loginUsername","admin");
map.put("loginPassword","admin");
servletRegistrationBean.setInitParameters(map);
returnservletRegistrationBean;
}
//配置druid监控的filter
@Bean
publicFilterRegistrationBeandruidFlilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
Map<String,String>stringStringMap=newHashMap<>();
stringStringMap.put("exclusions","*.js,*.html,*.css,/druid/*");
filterRegistrationBean.setInitParameters(stringStringMap);
returnfilterRegistrationBean;
}
}
这里初始化了一个我们自己的数据源 配置使用spring.datasource开头的配置 并初始化了druid专用的Servlet和Filter
下面我们写配置项 如下:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/test
driver-class-name: com.mysql.jdbc.Driver
常用配置:
type: com.alibaba.druid.pool.DruidDataSource
#常用属性配置以下配置默认绑定不到druid上面我们需要新建一个配置类返回druidDataSource实例指定为使用配置文件配置才行
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT1FROMDUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
这样我们就完成了druid的整合