首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Tomcat 服務器長時間無訪問導致 SSH 連接異常的解決方案

     編輯:程式設計綜合問答

問題背景

在使用 Tomcat 服務器時,如果大約 10 個小時沒有訪問應用,通過 SSH 連接操作時會拋出異常。用戶已在 MySQL 配置中設置了長連接參數:

wait_timeout=2147483
interactive_timeout=2147483

但問題依然存在,錯誤截圖如下:

核心原因分析

這類問題通常不是數據庫配置的問題,而是連接池管理導致的。常見原因包括:

  • 使用的連接池(如 DBCP、C3P0、HikariCP)未配置空閒連接檢測或連接驗證機制
  • 長時間不使用導致數據庫服務器主動斷開連接,而連接池中仍持有失效連接
  • 應用未正確釋放連接,導致連接洩漏

解決方案

1. 配置連接池驗證機制

以常用的 Druid 連接池為例,需添加以下關鍵配置:

# 驗證連接有效性
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false

# 空閒連接回收設置
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000

2. Tomcat 數據源配置示例

若在 context.xml 中配置 JNDI 數據源:

<Resource name="jdbc/myDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    minEvictableIdleTimeMillis="300000"
    maxActive="100"
    minIdle="10"
    maxWait="10000"
    username="root"
    password="password"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/mydb?autoReconnect=true"/>

3. 檢查應用代碼

  • 確保所有數據庫操作使用 try-with-resources 或 finally 塊關閉連接
  • 避免長事務持有連接不放
  • 排查是否有連接洩漏(可通過連接池監控功能發現)

最佳實踐建議

  1. 優先使用成熟連接池:HikariCP、Druid、Tomcat JDBC Pool
  2. 啟用連接驗證:設置 testWhileIdle=true 和合理的 validationQuery
  3. 監控連接池狀態:通過 JMX 或管理控制台觀察活躍/空閒連接數
  4. 設置合理超時:連接池的 maxWait、minEvictableIdleTimeMillis 需小於數據庫的 wait_timeout

通過上述配置,可有效解決長時間無訪問後連接失效的問題,保證應用的高可用性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved