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
lastUse 時間戳),判定為閒置而銷毀。wait_timeout)主動斷開空閒連線,JBoss 偵測 pingDatabase failed 後標記無效並銷毀。valid-connection-checker (Oracle 用 SELECT 1 FROM DUAL),失敗則銷毀。在 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>
SQLNET.ORA 加入 SQLNET.EXPIRE_TIME = 10 (分鐘),讓資料庫主動探測死連線。wait_timeout 設大於連線池 idle-timeout-minutes。應用層面:使用 HikariCP/Apache DBCP 內建 connectionTimeout/idleTimeout/maxLifetime,並在取得連線前做 isValid(1) 檢查。
| 參數 | 建議值 | 說明 |
|---|---|---|
idle-timeout-minutes | 10-30 | 閒置回收,需 <背景驗證> 配合 |
background-validation-millis | 30000-60000 | 背景驗證頻率,太頻繁影響效能 |
validate-on-match | true | 借用時驗證,確保拿到的連線可用 |
maxLifetime (Hikari) | 30 分鐘 | 連線最大壽命,強制輪換避免永久失效 |
核心原則:**寧可多驗證幾次,也不要把死連線借給業務**。配置好驗證機制,長時間閒置不再是問題。