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