调整pool参数
SpringBoot 项目默认自动使用 HikariCP, 最近为了进行数据库session控制, 特意调小了缺省的 poolSize, 原本以为会自动生效, 经过压测发现还是使用默认的 poolSize.
原来的代码 DataSource 对象使用的是 Spring DataSource builder创建的, 需要修改为 HikariDataSource 来创建.
我直接使用 https://blog.csdn.net/abu935009066/article/details/127155653 文章中的代码.
监控 HikariCP
我们需要监控到数据库连接池设置是否合理, 所以需要有手段能监控到连接池对应的指标, HikariCP 提供了 LoggingMeterRegistry 是一个非常好的监控手段, 将指标输出日志, 便于长期分析.
具体使用参考 https://blog.csdn.net/abu935009066/article/details/127155653
HikariCP 监控指标.
一般情况下, 只要监控看两个指标就足够了:
- 如果 hikaricp.connections.pending 指标经常性大于0, 说明poolSize偏小了. 2
- 如果 hikaricp.connections.idle 指标非常接近 poolSize, 说明poolSize偏大了.
指标 详解
hikaricp.connections 当前总连接数,包括空闲的连接和使用中的连接。(4 = 3 + 1)对应上面日志;
Connections = activeConnection + idleConnections,会随着连接使用情况变化。
hikaricp.connections.active 正在使用中活跃连接数 (1),会随着连接使用情况变化。
hikaricp.connections.idle 空闲连接数 (3) ,会随着连接使用情况变化。
hikaricp.connections.max 最大连接数 (10),初始配置。
hikaricp.connections.min 最小连接数 (3),初始配置。
hikaricp.connections.pending 正在等待连接的线程数量(0)。重点:一般来说,这里应该都是0,如果存在这个数据并且时间较长要触发告警,视情况加大最大连接数。
hikaricp.connections.acquire 获取每个连接需要时间,单位为ns。
hikaricp.connections.creation 连接创建时间,单位为ms。
hikaricp.connections.timeout 创建连接超时次数。
hikaricp.connections.usage 连接从池中取出到返回的时间,单位为ms。即连接被业务占用时间(3.017s)。重点:这个时间长的话,
可能是慢SQL或者长事务导致连接被占用问题。
HikariCP 的配置参数
摘自 <https://www.cnblogs.com/coderaniu/p/15185579.html
# 不同数据源这四个配置都会用到
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#以下的配置项是hikari特有的配置
# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
spring.datasource.hikari.connection-timeout=30000
# 最小连接数
spring.datasource.hikari.minimum-idle=5
# 最大连接数
spring.datasource.hikari.maximum-pool-size=15
# 自动提交
spring.datasource.hikari.auto-commit=true
# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),默认:10分钟
spring.datasource.hikari.idle-timeout=600000
# 连接池名字
spring.datasource.hikari.pool-name=DatebookHikariCP
# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms,建议设置比数据库超时时长少60秒
spring.datasource.hikari.max-lifetime=28740000
spring.datasource.hikari.connection-test-query=SELECT 1
#以下是针对MYSQL驱动的配置参数
# 在每个连接中缓存的语句的数量。默认值为保守值25。建议将其设置为250-500之间
spring.datasource.hikari.prepStmtCacheSize = 300
# 缓存的已准备SQL语句的最大长度,默认值是256,但是往往这个长度不够用
spring.datasource.hikari.prepStmtCacheSqlLimit = 2048
# 缓存开关,如果这里设置为false,上面两个参数都不生效
spring.datasource.hikari.cachePrepStmts = true
#较新版本的 MySQL 支持服务器端准备好的语句,这可以提供实质性的性能提升
spring.datasource.hikari.useServerPrepStmts = true