源碼地址:https://github.com/877148107/springboot_integrate
Druid源碼地址:https://github.com/alibaba/druid/
Druid常見使用問題:https://github.com/alibaba/druid/wiki/常見問題
-
Druid是什麼?
Druid是Java語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。
-
SpringBoot數據源自動配置DataSourceAutoConfiguration
1)、DataSourceConfiguration
根據配置文件的配置創建數據源,默認使用HikariDataSource。可以使用spring.datasource.type來指定數據源類型
2)、DataSourceInitializerInvoker(ApplicationListener)
/**
* Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on
* {@link InitializingBean#afterPropertiesSet()} and {@literal data-*.sql} SQL scripts on
* a {@link DataSourceSchemaCreatedEvent}.
*
* @author Stephane Nicoll
* @see DataSourceAutoConfiguration
*/
class DataSourceInitializerInvoker implements ApplicationListener<DataSourceSchemaCreatedEvent>, InitializingBean {
1、 DataSourceInitializer->runScripts運行建表語句和插入數據語句,默認只需要將文件名稱設置爲schema-*.sql、data-*.sql
2、DataSourceInitializer->getScript獲取建表語句或者插入語句的文件
3、可以自己指定schema文件
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.0.113:3306/Mybatis
driver-class-name: com.mysql.jdbc.Driver
hikari:
schema:
- classpath:table.sql
- classpath:data.sql
4、JdbcTemplateAutoConfiguration自動配置了JdbcTemplate,直接注入使用
項目下的sql文件不執行,需要設置DataSourceInitializationMode模式(ALWAYS,EMBEDDED,NEVER),默認是EMBEDDED
public enum DataSourceInitializationMode {
ALWAYS,
EMBEDDED,
NEVER;
private DataSourceInitializationMode() {
}
}
class DataSourceInitializer {
void initSchema() {
List<Resource> scripts = getScripts("spring.datasource.data", this.properties.getData(), "data");
if (!scripts.isEmpty()) {
if (!isEnabled()) {
logger.debug("Initialization disabled (not running data scripts)");
return;
}
String username = this.properties.getDataUsername();
String password = this.properties.getDataPassword();
runScripts(scripts, username, password);
}
}
private boolean isEnabled() {
DataSourceInitializationMode mode = this.properties.getInitializationMode();
if (mode == DataSourceInitializationMode.NEVER) {
return false;
}
if (mode == DataSourceInitializationMode.EMBEDDED && !isEmbedded()) {
return false;
}
return true;
}
}
-
SpringBoot整合Druid數據源
1)、添加依賴
<!--引入阿里數據源druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
2)、指定數據源及配置相關屬性
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.0.113:3306/Mybatis
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 數據源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
很多屬性在druid的數據源屬性和配置文件的數據沒有對應起來需要自己寫一個配置文件將對應的數據源和配置文件綁定
@Configuration
public class MyDruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DruidDataSource druidDataSource(){
return new DruidDataSource();
}
}
肯定出現錯誤信息如下,根據提示配置文件中配置了filters: stat,wall,log4j,那麼這個配置只有log4j不存,,只需要導入其中一個依賴jar即可
Failed to bind properties under 'spring.datasource' to com.alibaba.druid.pool.DruidDataSource:
Property: spring.datasource.filters
Value: stat,wall,log4j
Origin: class path resource [application.yml]:19:14
Reason: org.apache.log4j.Priority
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
3)、配置數據源監控
@Configuration
public class MyDruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
/**配置Druid數據源監控**/
/**
* 配置後臺管理的Servlet
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
Map<String,Object> param = new HashMap<>();
param.put("loginUsername","admin");
param.put("loginPassword","123456");
param.put("allow","");
bean.setInitParameters(param);
return bean;
}
/**
* 配置web監控的filte
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,Object> param = new HashMap<>();
param.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(param);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
效果: