前言
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的整合