單線程循環:建立連接 → 每 30 秒查一次庫 → 一直運行。問:合理嗎?能否保持長連?
// HikariCP 示例(Spring Boot 默認)
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://host:3306/db");
config.setUsername("user");
config.setPassword("pass");
config.setMaximumPoolSize(10); // 最大連接數
config.setMinimumIdle(2); // 最小閒置
config.setIdleTimeout(300_000); // 5 分鐘閒置回收
config.setMaxLifetime(1_800_000); // 30 分鐘強制換新
config.setConnectionTimeout(30_000); // 獲取連接超時
config.setPoolName("ScheduledTaskPool");
HikariDataSource ds = new HikariDataSource(config);
// 定時任務中
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT ...");
ResultSet rs = ps.executeQuery()) {
// 處理結果
} // 自動歸還連接
| 維度 | 單長連接 | 連接池 |
|---|---|---|
| 斷線自動恢復 | 需手寫重試 | 內建驗證(connectionTestQuery)+ 自動補充 |
| 併發支撐 | 1 | 可配置 10-100+ |
| 資源控制 | 無 | 閒置回收、最大壽命、泄漏檢測 |
| 效能 | 單線程串行 | 多線程並行,複用物理連接 |
@Scheduled(fixedRate = 30000) (Spring) 或 ScheduledExecutorService (JDK)。@Scheduled(fixedDelay = 30000) 或加分佈式鎖。單線程長連接是反模式。引入 **HikariCP/Druid 連接池**,配合 @Scheduled 定時任務,才是生產級寫法。