HikariCP连接池设置和监控
1、HikariCP连接池设置和监控
调整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
2、技术经理:求求你,别再乱改数据库连接池的大小了! - 知乎
摘自 https://zhuanlan.zhihu.com/p/72734863
连接数计算公式
下面公式由 PostgreSQL 提供,不过底层原理是不变的,它适用于市面上绝大部分数据库产品。还有,你应该模拟预期的访问量,并通过下面的公式先设置一个偏合理的值,然后在实际的测试中,通过微调,来寻找最合适的连接数大小。
连接数 = ((核心数 * 2) + 有效磁盘数)
核心数不应包含超线程(hyper thread),即使打开了超线程也是如此,如果热点数据全被缓存了,那么有效磁盘数实际是0,随着缓存命中率的下降,有效磁盘数也逐渐趋近于实际的磁盘数。另外需要注意,这一公式作用于SSD 的效果如何,尚未明了。
好了,按照这个公式,如果说你的服务器 CPU 是 4核 i7 的,连接池大小应该为 ((4*2)+1)=9。
取个整, 我们就设置为 10 吧。你这个行不行啊?10 也太小了吧!
posted on 2025-04-28 19:24 wenbin_ouyang 阅读(428) 评论(0) 收藏 举报
浙公网安备 33010602011771号