MySQL 服務重啟後,Java 程序持有的連接失效,拋出 CommunicationsException,且無法自動恢復查詢。
程序未實現斷線檢測與重連邏輯:
直接使用 DriverManager.getConnection() 獲取的連接無自動重連能力,連接斷開後對象仍被引用,後續操作必然失敗。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
// 配置自動重連
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://host:3306/db?autoReconnect=true&useSSL=false");
config.setMaximumPoolSize(10);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setConnectionTestQuery("SELECT 1"); // 心跳檢測
HikariDataSource ds = new HikariDataSource(config);
autoReconnect=true:JDBC 級嘗試重連(不完全可靠)connectionTestQuery:借用連接前執行輕量查詢驗證有效性maxLifetime:強制回收長連接,避免服務端主動斷開public Connection getValidConnection() throws SQLException {
while (true) {
try {
Connection conn = DriverManager.getConnection(url, user, pass);
if (conn.isValid(2)) return conn;
} catch (SQLException e) {
Thread.sleep(5000); // 等待 5 秒重試
}
}
}
生產環境必須使用成熟連接池(HikariCP/Druid),手寫重試屬造輪子且難以覆蓋邊界情況。