vlambda博客
学习文章列表

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

项目中大家都会使用到数据库连接池来管理数据库链接。使用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

默认开启StatFilter

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格式的,说一下各个参数的含义吧,只说关键的监控字段

参数 值(栗子中的值) 含义
ActiveCount 0 当前连接池中活跃连接数
ActivePeak 1 连接池中活跃连接数峰值
ActivePeakTime 2020/4/13 16:12 活跃连接池峰值出现的时间
BlobOpenCount 0 Blob打开数
ClobOpenCount 0 Clob打开数
CommitCount 0 提交数
ConnectionHoldTimeHistogram 0,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],这个值是一个数组,数值的索引位的含义如上述,第几索引上的数据就代表在这个时间区间内包含的连接数
ErrorCount 0 错误数
ExecuteCount 0 执行数
InitialSize 60 连接池建立时创建的初始化连接数
LogicCloseCount 2 产生的逻辑连接关闭总数
LogicConnectCount 2 产生的逻辑连接建立总数
LogicConnectErrorCount 0 产生的逻辑连接出错总数
LoginTimeout 0 数据库客户端登录超时时间
MaxActive 200 连接池中最大的活跃连接数
MinIdle 120 连接池中最小的活跃连接数
NotEmptyWaitCount 0 获取连接时最多等待多少次
NotEmptyWaitMillis 0 获取连接时最多等待多长时间,毫秒为单位
PSCacheAccessCount 0 PSCache访问总数
PSCacheHitCount 0 PSCache命中次数
PSCacheMissCount 0 PSCache未命中次数
PhysicalCloseCount 0 产生的物理关闭总数
PhysicalConnectCount 60 产生的物理连接建立总数
PhysicalConnectErrorCount 0 产生的物理连接失败总数
PoolingCount 60 当前连接池中的连接数
PoolingPeak 60 连接池中连接数的峰值
PoolingPeakTime 2020/4/13 16:12 连接池数目峰值出现的时间
QueryTimeout 0 查询超时数
RollbackCount 0 回滚数
StartTransactionCount 0 事务开始的个数
TransactionHistogram 0,0,0,0,0,0,0,0 事务运行时间分布,分布区间为[0-10 ms, 10-100 ms, 100-1 s, 1-10 s, 10-100 s, >100 s],这个值是一个数组,数值的索引位的含义如上述,第几索引上的数据就代表在这个时间区间内包含的事务数
TransactionQueryTimeout 0 事务查询超时数
WaitThreadCount 0 当前等待获取连接的线程数

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