首先在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

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 | 当前等待获取连接的线程数 | 










