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