背景
程式碼呼叫 conn.isValid(0) 檢測連線存活,編譯/運行時出現 AbstractMethodError 或 SQLFeatureNotSupportedException,懷疑驅動版本不支援 JDBC 4.0 (Java 6+) 引入的 isValid 方法。
DB2 JDBC 驅動版本對照 (關鍵節點)
| 驅動包名稱 | 對應 DB2 版本 | JDBC 版本 | isValid 支援 |
| db2jcc.jar / db2jcc4.jar | DB2 9.5 / 9.7 | JDBC 3.0 / 4.0 | 4.0 版起支援 (db2jcc4.jar) |
| db2jcc4.jar | DB2 10.1 / 10.5 | JDBC 4.0 | **支援** |
| db2jcc4.jar | DB2 11.1 / 11.5 | JDBC 4.1 / 4.2 | **支援** |
快速驗證當前驅動
// 列印驅動版本資訊
DatabaseMetaData meta = conn.getMetaData();
System.out.println("Driver: " + meta.getDriverName() + " " + meta.getDriverVersion());
System.out.println("JDBC Major: " + meta.getJDBCMajorVersion() + " Minor: " + meta.getJDBCMinorVersion());
若驅動不支援 isValid:替代方案
方案一:輕量查詢 (通用、最穩)
public boolean isAlive(Connection conn) {
try (Statement st = conn.createStatement()) {
return st.execute("SELECT 1 FROM SYSIBM.SYSDUMMY1"); // DB2 單行虛擬表
} catch (SQLException e) {
return false;
}
}
方案二:Connection.isValid 回退包裝
public boolean isAlive(Connection conn) {
try {
if (conn.isValid(1)) return true; // 嘗試標準方法
} catch (AbstractMethodError | SQLFeatureNotSupportedException ignored) {
// 忽略,落回方案一
}
return isAliveFallback(conn);
}
方案三:連線池內建驗證 (HikariCP / DBCP2 / C3P0)
# HikariCP
spring.datasource.hikari.connection-test-query=SELECT 1 FROM SYSIBM.SYSDUMMY1
spring.datasource.hikari.validation-timeout=2000
建議
- 升級至最新
db2jcc4.jar (Maven: com.ibm.db2:jcc:11.5.9.0) 直接獲得 isValid 支援。
- 統一由連線池負責存活檢測,業務代碼勿直接呼叫
isValid,降低耦合。
- 上一篇文章: C 語言 system() 呼叫 Python 腳本返回 256:進程返回值解碼與排查指南
- 下一篇文章: JavaScript 正則表達式檢測 alert() 函數調用並禁止輸入
Copyright ©
程式碼之家 All Rights Reserved