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

Java 定時任務長連接資料庫:連接池才是正解

     編輯:程式設計綜合問答

場景

單線程循環:建立連接 → 每 30 秒查一次庫 → 一直運行。問:合理嗎?能否保持長連?

直接回答

  • 能跑通,但**不合理**,隱患極大。
  • 長連接會**斷開**(防火牆/資料庫 idle timeout、網絡抖動),需自寫重連邏輯,極易出 Bug。
  • 併發上來時,單連接成嚴重瓶頸,線程阻塞、響應變慢、甚至 OOM。

標準解法:資料庫連接池

// 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)。
  • 任務執行時間 > 30 秒時,防止重疊:@Scheduled(fixedDelay = 30000) 或加分佈式鎖。

總結

單線程長連接是反模式。引入 **HikariCP/Druid 連接池**,配合 @Scheduled 定時任務,才是生產級寫法。

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