HikariCP连接池的学习
背景
同事发了一个很牛B的文档
从hikari的源码到mat分析dump的过程
很详尽.
文档里说到了一个解决 TCP链接断掉,
但是连接池不释放的解决方案
想着找时间尝试一下.
网上类似的解决方案
spring:
datasource:
url: jdbc:mysql://10.10.121.219:33331/mysql?serverTimezone=UTC
hikari:
connection-timeout: 30000
idle-timeout: 600000 # default value
max-lifetime: 1800000 # default value
data-source-properties:
socketTimeout: 30000 #30 seconds socket timeout; if longest query takes > 30 sec --> problem
username: root
password: 123456
关于参数说明
connection-timeout
# default value - will set mysql jdbc loginTimeout
# to 500+connectionTimeout - MAX time we wait.
# On windows this is anyway "TCP three-way handshake
# is limited to a 21-second timeframe", so every value >21 no effect.
socketTimeout
# 30 seconds socket timeout;
# if longest query takes > 30 sec --> problem
其他参数
spring.datasource.hikari.connection-timeout=50000
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.pool-name=ConnPool
spring.datasource.hikari.connection-test-query=select 1 from dual
spring.datasource.hikari.data-source-properties.cachePrepStmts=true
spring.datasource.hikari.data-source-properties.prepStmtCacheSize=250
spring.datasource.hikari.data-source-properties.prepStmtCacheSqlLimit=2048
spring.datasource.hikari.data-source-properties.useServerPrepStmts=true
spring.datasource.hikari.data-source-properties.useLocalSessionState=true
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.datasource.hikari.data-source-properties.cacheResultSetMetadata=true
spring.datasource.hikari.data-source-properties.cacheServerConfiguration=true
spring.datasource.hikari.data-source-properties.elideSetAutoCommits=true
spring.datasource.hikari.data-source-properties.maintainTimeStats=false
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.com.zaxxer.hikari=TRACE
测试验证
产品登录时都会写入审计, 想着能否通过将审计表加锁的方式
来制造一个事务无法提交的场景, 导致连接池不释放.
然后通过增加参数的方式来实现能否解决这个问题.
测试思路:
1. 编写一个for 循环, 循环内 提交事务, 但是不提交, 直接跳出本层. 重新循环
2. 执行命令, 导致连接池慢. 事务未提交.
3. 等待 75s 验证在当前的情况下, 链接是否还存在.
4. 可以使用 ss |grep databaseport 的方式进行查看.
5. 如果4 发现链接还是ESTAB的. 将数据库的网卡设置为关闭状态,并且等待 75秒
6. tcp链接应该已经关闭, 通过 com.zaxxer.hikari: debug 确认 数据库连接池是否有可用的.
7. 打开数据库的网卡, 确认能否登录使用 (不建议停网时间太长, 避免应用宕机.)