源码地址: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;
}
}
效果: