HikariCP连接池的学习

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. 打开数据库的网卡, 确认能否登录使用 (不建议停网时间太长, 避免应用宕机.)
posted @ 2024-04-04 06:35  济南小老虎  阅读(17)  评论(0编辑  收藏  举报