使用druid的监控组件进行数据库连接池的监控

1,866 阅读5分钟

项目中大家都会使用到数据库连接池来管理数据库链接。使用druid做数据库连接池的也很多,druid连接池提供监控组件,让我们可以很方便对数据库连接池进行监控,让你可以清晰的看到数据库连接池的运行情况,也可以记录一些慢sql记录,用来保证应用的服务质量。

首先在springboot中引入druid数据库连接池

在springboot中引入druid数据库连接池非常简单,直接在application.yml配置文件中加上相关配置:

spring:
  datasource:
    url: 数据库连接
    username: 数据库用户名
    password: 数据库密码
    driver-class-name: com.mysql.jdbc.Driver
    platform: mysql
    type: com.alibaba.druid.pool.DruidDataSource
    # 下面为连接池的补充设置,应用到上面所有数据源中
    # 初始化大小,最小,最大
    initialSize: 60
    minIdle: 120
    maxActive: 200
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    filters: stat,wall,log4j
    # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    # 合并多个DruidDataSource的监控数据
    #useGlobalDataSourceStat: true

这个配置是通用的,只需要把连接池的type替换成druid数据库对应的类型既可

  • type: com.alibaba.druid.pool.DruidDataSource 这样既可,在引入的orm框架中就可以直接使用

springboot中开启druid监控

druid中内置了很多种Filter,这里使用StatFilter,是用于统计监控信息。开启配置的有两种方式

springboot中开启druid监控方式一

通过默认配置开启,就是上面数据库连接池里面这一行配置

# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j

image.png

springboot中开启druid监控方式二

自定义配置来开启StatFilter,配置也很简单

      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      # filters: stat,wall,log4j
      # 添加StatFilter配置
      filter:
        stat:
          enabled: true
          db-type: mysql
          log-slow-sql: true
          slow-sql-millis: 1000

这几个配置就不详解了,都是字面意思,slow-sql-millis,慢sql时间是毫秒单位的

查询监控的方式
通过DruidStatManagerFacade.getInstance().getDataSourceStatDataList()方法查询数据库链接池监控信息

代码中可以通过DruidStatManagerFacade.getInstance().getDataSourceStatDataList()方法查询数据库链接池监控信息,大家可以通过服务接口、定时任务写入数据库、定时任务写入日志抽取到kafka等方式来存储这个监控信息,进行实时监控,来看下监控返回的数据:

[
    {
        "ActiveCount": 0,
        "ActivePeak": 8,
        "ActivePeakTime": 1586764216671,
        "BlobOpenCount": 0,
        "ClobOpenCount": 0,
        "CommitCount": 67,
        "ConnectionHoldTimeHistogram": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
        ],
        "DbType": "mysql",
        "DefaultAutoCommit": true,
        "DriverClassName": "com.mysql.jdbc.Driver",
        "ErrorCount": 0,
        "ExceptionSorterClassName": "com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
        "ExecuteCount": 91,
        "FilterClassNames": [],
        "Identity": 1606272155,
        "InitialSize": 0,
        "LogicCloseCount": 93,
        "LogicConnectCount": 93,
        "LogicConnectErrorCount": 0,
        "LoginTimeout": 0,
        "MaxActive": 8,
        "MinIdle": 0,
        "Name": "DataSource-1606272155",
        "NotEmptyWaitCount": 69,
        "NotEmptyWaitMillis": 0,
        "PSCacheAccessCount": 0,
        "PSCacheHitCount": 0,
        "PSCacheMissCount": 0,
        "PhysicalCloseCount": 0,
        "PhysicalConnectCount": 8,
        "PhysicalConnectErrorCount": 0,
        "PoolingCount": 8,
        "PoolingPeak": 8,
        "PoolingPeakTime": 1586764216896,
        "QueryTimeout": 0,
        "RemoveAbandoned": false,
        "RollbackCount": 0,
        "StartTransactionCount": 67,
        "TestOnBorrow": false,
        "TestOnReturn": false,
        "TestWhileIdle": true,
        "TransactionHistogram": [
            0,
            5,
            62,
            0,
            0,
            0,
            0
        ],
        "TransactionQueryTimeout": 0,
        "URL": "",
        "UserName": "",
        "ValidConnectionCheckerClassName": "com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
        "WaitThreadCount": 0
    }
]

数据返回是一个json格式的,说一下各个参数的含义吧,只说关键的监控字段

参数值(栗子中的值)含义
ActiveCount0当前连接池中活跃连接数
ActivePeak1连接池中活跃连接数峰值
ActivePeakTime2020/4/13 16:12活跃连接池峰值出现的时间
BlobOpenCount0Blob打开数
ClobOpenCount0Clob打开数
CommitCount0提交数
ConnectionHoldTimeHistogram0,0,0,0,0,0,0,0连接持有时间分布,分布区间为[0-1 ms, 1-10 ms, 10-100 ms, 100ms-1s, 1-10 s, 10-100 s, 100-1000 s, >1000 s],这个值是一个数组,数值的索引位的含义如上述,第几索引上的数据就代表在这个时间区间内包含的连接数
ErrorCount0错误数
ExecuteCount0执行数
InitialSize60连接池建立时创建的初始化连接数
LogicCloseCount2产生的逻辑连接关闭总数
LogicConnectCount2产生的逻辑连接建立总数
LogicConnectErrorCount0产生的逻辑连接出错总数
LoginTimeout0数据库客户端登录超时时间
MaxActive200连接池中最大的活跃连接数
MinIdle120连接池中最小的活跃连接数
NotEmptyWaitCount0获取连接时最多等待多少次
NotEmptyWaitMillis0获取连接时最多等待多长时间,毫秒为单位
PSCacheAccessCount0PSCache访问总数
PSCacheHitCount0PSCache命中次数
PSCacheMissCount0PSCache未命中次数
PhysicalCloseCount0产生的物理关闭总数
PhysicalConnectCount60产生的物理连接建立总数
PhysicalConnectErrorCount0产生的物理连接失败总数
PoolingCount60当前连接池中的连接数
PoolingPeak60连接池中连接数的峰值
PoolingPeakTime2020/4/13 16:12连接池数目峰值出现的时间
QueryTimeout0查询超时数
RollbackCount0回滚数
StartTransactionCount0事务开始的个数
TransactionHistogram0,0,0,0,0,0,0,0事务运行时间分布,分布区间为[0-10 ms, 10-100 ms, 100-1 s, 1-10 s, 10-100 s, >100 s],这个值是一个数组,数值的索引位的含义如上述,第几索引上的数据就代表在这个时间区间内包含的事务数
TransactionQueryTimeout0事务查询超时数
WaitThreadCount0当前等待获取连接的线程数

使用druid的监控组件进行数据库连接池的监控就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。谢谢大家!