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

JBoss 7 長時間閒置連線被銷毀:Destroying connection 原因與解決

     編輯:程式設計綜合問答

錯誤日誌解讀

WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] 
IJ000612: Destroying connection that could not be successfully matched: 
... lastUse=1429770682906 ... pool=HTMotMainDS

WARN  [org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory] 
Destroying connection that is not valid, due to the following exception: 
oracle.jdbc.driver.T4CConnection@4ff84c65: java.sql.SQLException: pingDatabase failed status=-2

根因分析

  1. 閒置超時:連線池偵測到連線長時間未使用(lastUse 時間戳),判定為閒置而銷毀。
  2. 連線失效:資料庫端(防火牆/資料庫參數 wait_timeout)主動斷開空閒連線,JBoss 偵測 pingDatabase failed 後標記無效並銷毀。
  3. 驗證機制觸發:JBoss 定期或借用時執行 valid-connection-checker (Oracle 用 SELECT 1 FROM DUAL),失敗則銷毀。

解決方案(按推薦順序)

1. 啟用連線驗證(最關鍵)

在 standalone.xml / domain.xml 資料源定義中加入:

<datasource jta="true" jndi-name="java:/HTMotMainDS" pool-name="HTMotMainDS">
    <connection-url>jdbc:oracle:thin:@host:1521:sid</connection-url>
    <driver>oracle</driver>
    <pool>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>50</max-pool-size>
        <prefill>true</prefill>
    </pool>
    <validation>
        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
        <check-valid-connection-sql>SELECT 1 FROM DUAL</check-valid-connection-sql>
        <validate-on-match>true</validate-on-match>  <!-- 借用時驗證 -->
        <background-validation>true</background-validation>   <!-- 背景驗證 -->
        <background-validation-millis>60000</background-validation-millis> <!-- 60 秒一次 -->
        <use-fast-fail>true</use-fast-fail>
    </validation>
    <timeout>
        <idle-timeout-minutes>15</idle-timeout-minutes>  <!-- 閒置 15 分鐘回收 -->
    </timeout>
</datasource>

2. 調整資料庫端參數

  • Oracle:SQLNET.ORA 加入 SQLNET.EXPIRE_TIME = 10 (分鐘),讓資料庫主動探測死連線。
  • MySQL:wait_timeout 設大於連線池 idle-timeout-minutes。

3. 客戶端心跳/重試

應用層面:使用 HikariCP/Apache DBCP 內建 connectionTimeout/idleTimeout/maxLifetime,並在取得連線前做 isValid(1) 檢查。

關鍵參數對照表

參數建議值說明
idle-timeout-minutes10-30閒置回收,需 <背景驗證> 配合
background-validation-millis30000-60000背景驗證頻率,太頻繁影響效能
validate-on-matchtrue借用時驗證,確保拿到的連線可用
maxLifetime (Hikari)30 分鐘連線最大壽命,強制輪換避免永久失效

核心原則:**寧可多驗證幾次,也不要把死連線借給業務**。配置好驗證機制,長時間閒置不再是問題。

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