Druid 简介
Java 程序很大一部分要操作数据库,为了进步性能操作数据库的时候,又不得不应用数据库连接池。
Druid 是阿里巴巴开源平台上一个数据库连接池实现,联合了 C3P0、DBCP 等 DB 池的长处,同时退出了日志监控。
Druid 能够很好的监控 DB 池连贯和 SQL 的执行状况,天生就是针对监控而生的 DB 连接池。
Druid 曾经在阿里巴巴部署了超过 600 个利用,通过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0 以上默认应用 Hikari 数据源,能够说 Hikari 与 Driud 都是以后 Java Web 上最优良的数据源,咱们来重点介绍 Spring Boot 如何集成 Druid 数据源,如何实现数据库监控。
Github 地址:https://github.com/alibaba/dr…
官网 wiki:wiki
简略应用
Spring Boot 默认的数据源是:
- 2.0 之前:
org.apache.tomcat.jdbc.pool.DataSource
- 2.0 及之后:
com.zaxxer.hikari.HikariDataSource
在 springboot 中切换数据源非常简单 ,只须要在配置文件中指定 spring.datasource.type
为咱们指定的类型就好了。
eg:spring.datassource.type=com.alibaba.druid.pool.DruidDataSource
这样就实现切换咱们的数据源为 Druid。这个 type 的值是 DataSource 的接口的实现。
Druid 各项配置
配置 | 缺省值 | 阐明 |
---|---|---|
name | 配置这个属性的意义在于,如果存在多个数据源,监控的时候能够通过名字来辨别开来。如果没有配置,将会生成一个名字,格局是:”DataSource-“+ System.identityHashCode(this). 另外配置此属性至多在 1.0.5 版本中是不起作用的,强行设置 name 会出错。 | |
url | 连贯数据库的 url,不同数据库不一样。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | |
username | 连贯数据库的用户名 | |
password | 连贯数据库的明码。如果你不心愿明码间接写在配置文件中,能够应用 ConfigFilter。具体看这里 | |
driverClassName | 依据 url 自动识别 | 这一项可配可不配,如果不配置 druid 会依据 url 自动识别 dbType,而后抉择相应的 driverClassName |
initialSize | 0 | 初始化时建设物理连贯的个数。初始化产生在显示调用 init 办法,或者第一次 getConnection 时 |
maxActive | 8 | 最大连接池数量 |
maxIdle | 8 | 曾经不再应用,配置了也没成果 |
minIdle | 最小连接池数量 | |
maxWait | 获取连贯时最大等待时间,单位毫秒。配置了 maxWait 之后,缺省启用偏心锁,并发效率会有所降落,如果须要能够通过配置 useUnfairLock 属性为 true 应用非偏心锁。 | |
poolPreparedStatements | false | 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。 |
maxPoolPreparedStatementPerConnectionSize | -1 | 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。在 Druid 中,不会存在 Oracle 下 PSCache 占用内存过多的问题,能够把这个数值配置大一些,比如说 100 |
validationQuery | 用来检测连贯是否无效的 sql,要求是一个查问语句,罕用 select‘x’。如果 validationQuery 为 null,testOnBorrow、testOnReturn、testWhileIdle 都不会起作用。 | |
validationQueryTimeout | 单位:秒,检测连贯是否无效的超时工夫。底层调用 jdbc Statement 对象的 void setQueryTimeout(int seconds)办法 | |
testOnBorrow | true | 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。 |
testOnReturn | false | 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。 |
testWhileIdle | false | 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。 |
keepAlive | false(1.0.28) | 连接池中的 minIdle 数量以内的连贯,闲暇工夫超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。 |
timeBetweenEvictionRunsMillis | 1 分钟(1.0.14) | 有两个含意:1) Destroy 线程会检测连贯的间隔时间,如果连贯闲暇工夫大于等于 minEvictableIdleTimeMillis 则敞开物理连贯。2) testWhileIdle 的判断根据,具体看 testWhileIdle 属性的阐明 |
numTestsPerEvictionRun | 30 分钟(1.0.14) | 不再应用,一个 DruidDataSource 只反对一个 EvictionRun |
minEvictableIdleTimeMillis | 连贯放弃闲暇而不被驱赶的最小工夫 | |
connectionInitSqls | 物理连贯初始化的时候执行的 sql | |
exceptionSorter | 依据 dbType 自动识别 | 当数据库抛出一些不可复原的异样时,摈弃连贯 |
filters | 属性类型是字符串,通过别名的形式配置扩大插件,罕用的插件有:监控统计用的 filter:stat 日志用的 filter:log4j 进攻 sql 注入的 filter:wall | |
proxyFilters | 类型是 List<com.alibaba.druid.filter.Filter>,如果同时配置了 filters 和 proxyFilters,是组合关系,并非替换关系 |
不应用启动器
- 增加依赖
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!--mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtimen</scope>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
- 批改配置
咱们只有在配置文件中 指定咱们的数据源的类型为 Druid就能够切换到 Druid:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
# 指定类型为咱们本人的
type: com.alibaba.druid.pool.DruidDataSource
- 测试,打印出数据源
@Test
public void load(){System.out.println(dataSource.getClass());
}
能够看到:
这就阐明咱们援用胜利了!
配置文件
这是残缺的配置文件,因为不是应用 starter,所以属性不会主动拆卸,须要咱们写配置类。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 默认是不注入这些属性值的,须要本人绑定
#druid 数据源专有配置
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 200
# 配置获取连贯期待超时的工夫
maxWait: 60000
# 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连贯在池中最小生存的工夫,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 用来检测连贯是否无效的 sql,要求是一个查问语句
validationQuery: SELECT 1 FROM DUAL
# 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。testWhileIdle: true
# 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能
testOnBorrow: false
# 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。testOnReturn: false
# 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。poolPreparedStatements: true
# 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。max-pool-prepared-statement-per-connection-size: 50
#配置监控统计拦挡的 filters,stat: 监控统计、log4j:日志记录、wall:进攻 sql 注入
#如果容许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
# 合并多个 DruidDataSource 的监控数据
useGlobalDataSourceStat: true
# 通过 connectProperties 属性来关上 mergeSql 性能;慢 SQL 记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
- 配置类
@Configuration
public class DruidConfig {
/*
将自定义的 Druid 数据源增加到容器中,不再让 Spring Boot 主动创立
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource 从而让它们失效
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource 的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {return new DruidDataSource();
}
}
- 测试
咱们通过获取数据源的属性来判断刚刚的设置是否失效
@Test
public void contextLoads() throws SQLException {
// 看一下默认数据源
System.out.println(dataSource.getClass());
// 取得连贯
Connection connection = dataSource.getConnection();
System.out.println(connection);
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
// 敞开连贯
connection.close();}
能够看到,咱们设置的属性曾经配置进去了:
应用 starter 启动器
Druid 官网已提供启动器了,咱们只有应用启动器,就能实现 springboot 的主动拆卸,就不须要再通过配置类去注入咱们的 bean 了。
官网 starter 教程
- 增加依赖
<!--Druid starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
- 增加配置
druid 中默认的配置都是以 spring.datasource.druid.*
结尾的,所以咱们只有在配置文件中配置属性就好就好,不须要再写配置类去绑定配置信息:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
#druid 数据源专有配置
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 200
# 配置获取连贯期待超时的工夫
maxWait: 60000
# 配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连贯在池中最小生存的工夫,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 用来检测连贯是否无效的 sql,要求是一个查问语句
validationQuery: SELECT 1 FROM DUAL
# 倡议配置为 true,不影响性能,并且保障安全性。申请连贯的时候检测,如果闲暇工夫大于 timeBetweenEvictionRunsMillis,执行 validationQuery 检测连贯是否无效。testWhileIdle: true
# 申请连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能
testOnBorrow: false
# 偿还连贯时执行 validationQuery 检测连贯是否无效,做了这个配置会升高性能。testOnReturn: false
# 是否缓存 preparedStatement,也就是 PSCache。PSCache 对反对游标的数据库性能晋升微小,比如说 oracle。在 mysql 下倡议敞开。poolPreparedStatements: true
# 要启用 PSCache,必须配置大于 0,当大于 0 时,poolPreparedStatements 主动触发批改为 true。max-pool-prepared-statement-per-connection-size: 50
#配置监控统计拦挡的 filters,stat: 监控统计、log4j:日志记录、wall:进攻 sql 注入
#如果容许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
# 配置监控统计拦挡的 filters,去掉后监控界面 sql 无奈统计,比方不配置 stat, 咱们在 Druid 的监控页面中就拿不到想要的信息。filters: stat,wall,log4j
# 合并多个 DruidDataSource 的监控数据
useGlobalDataSourceStat: true
# 通过 connectProperties 属性来关上 mergeSql 性能;慢 SQL 记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
这样咱们刚刚的 DruidConfig 就能够不要了,再次启动测试类,发现也是失常读取到咱们的自定义配置:
这个时候咱们拜访localhost:8080/druid
,就能够进入 druid 默认的监控控制台。
配置多数据源
参考官网文档即可
配置 Druid 监控
Druid 数据源具备监控的性能,并提供了一个 web 界面不便用户查看,相似装置 路由器 时,人家也提供了一个默认的 web 页面。然而这个页面默认是所有人都能够拜访,不平安,所以个别咱们都要定制的去设置。
对于 Spring Boot 有两种配置形式,一种是基于配置类,一种是间接在配置文件中配置。
间接在配置文件中配置
比方间接在配置文件中配置如下,其余的配置也雷同,能够看官网:
# WebStatFilter 配置,阐明请参考 Druid Wiki,配置_配置 WebStatFilter
# 次要进行配置哪些申请须要 druid 监控,哪些不须要
spring.datasource.druid.web-stat-filter.enabled= #是否启用 StatFilter 默认值 false
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=
# StatViewServlet 配置,阐明请参考 Druid Wiki,配置_StatViewServlet 配置
spring.datasource.druid.stat-view-servlet.enabled= #是否启用 StatViewServlet 默认值 false
#申请门路
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
# 设置登录用户
spring.datasource.druid.stat-view-servlet.login-username=
# 设置登录明码
spring.datasource.druid.stat-view-servlet.login-password=
# 容许哪些 ip 拜访
spring.datasource.druid.stat-view-servlet.allow=
#禁止哪些 ip 拜访
spring.datasource.druid.stat-view-servlet.deny=
# Spring 监控配置,阐明请参考 Druid Github Wiki,配置_Druid 和 Spring 关联监控配置
spring.datasource.druid.aop-patterns= # Spring 监控 AOP 切入点,如 x.y.z.service.*, 配置多个英文逗号分隔
# 如果 spring.datasource.druid.aop-patterns 要代理的类没有定义 interface 请设置 spring.aop.proxy-target-class=true
通过配置类配置
@Configuration
public class MyConfig {
// 配置 Druid 监控治理后盾的 Servlet;// 内置 Servlet 容器时没有 web.xml 文件,所以应用 Spring Boot 的注册 Servlet 形式
@Bean
public ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 这些参数能够在 com.alibaba.druid.support.http.StatViewServlet
// 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); // 后盾治理界面的登录账号
initParams.put("loginPassword", "123456"); // 后盾治理界面的登录明码
// 后盾容许谁能够拜访
//initParams.put("allow", "localhost"):示意只有本机能够拜访
//initParams.put("allow", ""):为空或者为 null 时,示意容许所有拜访
initParams.put("allow", "");
//deny:Druid 后盾回绝谁拜访
//initParams.put("deny", "192.168.1.20"); 示意禁止此 ip 拜访
// 设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
// 配置 Druid 监控 之 web 监控的 filter
//WebStatFilter:用于配置 Web 和 Druid 数据源之间的治理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些申请进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
bean.setInitParameters(initParams);
//"/*" 示意过滤所有申请
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
其实能够看到,两者的配置是一样的。
如何配置 Filter
你能够通过 spring.datasource.druid.filters=stat,wall,log4j ...
的形式来启用相应的内置 Filter,不过这些 Filter 都是默认配置。如果默认配置不能满足你的需要,你能够放弃这种形式,通过配置文件来配置 Filter,上面是例子。
# 配置 StatFilter
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
# 配置 WallFilter
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false
# 其余 Filter 配置不再演示
目前为以下 Filter 提供了配置反对,请参考文档或者依据 IDE 提醒(spring.datasource.druid.filter.*
)进行配置。
- StatFilter
- WallFilter
- ConfigFilter
- EncodingConvertFilter
- Slf4jLogFilter
- Log4jFilter
- Log4j2Filter
- CommonsLogFilter
要想使自定义 Filter 配置失效须要将对应 Filter 的 enabled
设置为 true
,Druid Spring Boot Starter 默认禁用 StatFilter,你也能够将其 enabled
设置为 true
来启用它
参考
官网文档
参考