2019-4-19 #Java

Druid

介绍

Druid能够提供强大的监控和扩展功能;

github wiki

Druid Spring Boot Starter for Spring

Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控;

github

引入

<!-- 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" />   

回收的时候打印日志, 数据库连接的代码具体位置, 以确定是哪里没释放