首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 經典「8 小時問題」:連接池空閒超時與驗證策略

     編輯:MySQL 資料庫相關知識

問題成因

  • MySQL 預設 wait_timeout = 28800 秒(8 小時)
  • 空閒超時連接被 Server 主動斷開
  • 連接池(DBCP/C3P0)不知情,將失效連接分發給 DAO
  • DAO 拋出 CannotGetJdbcConnectionException

連接池配置對比

推薦配置範例



  
  
   
    
  




  
   
  

MySQL 端協同調整

  • 查看當前值:SHOW VARIABLES LIKE 'wait_timeout';
  • 調大數值:SET GLOBAL wait_timeout = 86400;(24 小時,需配合連接池驗證周期)
  • interactive_timeout 僅影響交互式客戶端

核心原則

  1. 連接池驗證周期 < MySQL wait_timeout(建議 1/2 到 1/4)
  2. 生產環境禁用 testOnBorrow,啟用 testWhileIdle/idleConnectionTestPeriod
  3. 驗證查詢用 SELECT 1 或 /* ping */ SELECT 1(極輕量)
  4. 監控連接池 NumIdle、NumActive、驗證失敗計數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略DBCP 參數C3P0 參數優缺點
借用時驗證testOnBorrow=true (預設)testConnectionOnCheckout=true✅ 安全,❌ 高併發下額外 RTT 影響效能
歸還時驗證testOnReturn=truetestConnectionOnCheckin=true同借用時
空閒驗證(推薦)testWhileIdle=true
timeBetweenEvictionRunsMillis < 8h
idleConnectionTestPeriod < 8h✅ 後台異步清理,✅ 無業務線程阻塞,⚠️ 需小於 wait_timeout