2019-4-19 #Java
Druid
介绍
Druid能够提供强大的监控和扩展功能;
Druid Spring Boot Starter for Spring
Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控;
引入
<!-- druid 数据源支持 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>就是作为一个数据库 数据源存在, 替换 dbcp, c3p0, 但是提供强大数据库,监控过滤
在application.properties 配置过滤器
# druid filter monitor
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=mysql
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
目前为以下 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 来启用它;
如何获取 Druid 的监控数据
Druid 的监控数据可以在开启 StatFilter 后通过 DruidStatManagerFacade 进行获取, 获取到监控数据之后你可以将其暴露给你的监控系统进行使用; Druid 默认的监控系统数据也来源于此; 下面给做一个简单的演示, 在 Spring Boot 中如何通过 HTTP 接口将 Druid 监控数据以 JSON 的形式暴露出去, 实际使用中你可以根据你的需要自由地对监控数据, 暴露方式进行扩展;
@RestController
public class DruidStatController {
@GetMapping("/druid/stat")
public Object druidStat(){
// DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据, 除此之外 DruidStatManagerFacade 还提供了一些其他方法, 你可以按需选择使用;
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}
.. 返回的自带的页面, View JSON API 可以查看API
打印完整SQL
datasource:
druid:
filters: stat,wall,slf4j
filter:
slf4j:
enabled: true
statementCloseAfterLogEnabled: false
statementCreateAfterLogEnabled: false
statementExecutableSqlLogEnable: true
statementExecuteAfterLogEnabled: false
statementExecuteBatchAfterLogEnabled: false
statementExecuteQueryAfterLogEnabled: false
statementExecuteUpdateAfterLogEnabled: false
statementLogEnabled: true
statementParameterSetLogEnabled: false
statementPrepareAfterLogEnabled: false
statementPrepareCallAfterLogEnabled: false
resultSetLogEnabled: false
logging:
level:
druid:
sql:
Statement: DEBUG # 重点
配置 wallfilter
需要自己配置一下限定规则, 配置filters属性比较简单, filters的类型是字符串, 多个filter使用逗号隔开; 即上面的, Filter配置列表
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
...
<property name="filters" value="wall"/>
</bean>拦截配置-永真条件
配置项 缺省值 描述 selectWhereAlwayTrueCheck true 检查SELECT语句的WHERE子句是否是一个永真条件 selectHavingAlwayTrueCheck true 检查SELECT语句的HAVING子句是否是一个永真条件 deleteWhereAlwayTrueCheck true 检查DELETE语句的WHERE子句是否是一个永真条件 deleteWhereNoneCheck false 检查DELETE语句是否无where条件, 这是有风险的, 但不是SQL注入类型的风险 updateWhereAlayTrueCheck true 检查UPDATE语句的WHERE子句是否是一个永真条件 updateWhereNoneCheck false 检查UPDATE语句是否无where条件, 这是有风险的, 但不是SQL注入类型的风险 conditionAndAlwayTrueAllow false 检查查询条件(WHERE/HAVING子句)中是否包含AND永真条件 conditionAndAlwayFalseAllow false 检查查询条件(WHERE/HAVING子句)中是否包含AND永假条件 conditionLikeTrueAllow true 检查查询条件(WHERE/HAVING子句)中是否包含LIKE永真条件
连接没有释放? active 25, maxActive 25
wait millis 10000, active 25, maxActive 25, creating 0
配置超时回收
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超时时间;单位为秒。180秒=3分钟 -->
<property name="removeAbandonedTimeout" value="180" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" /> 回收的时候打印日志, 数据库连接的代码具体位置, 以确定是哪里没释放