HikariCP連線池的學習

济南小老虎發表於2024-04-04

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. 開啟資料庫的網路卡, 確認能否登入使用 (不建議停網時間太長, 避免應用當機.)

相關文章