Class.forName("org.postgresql.Driver"); // 這行偶爾卡住 0.2~2 秒,無異常、無日志
Class.forName 觸發類加載、靜態塊執行。PostgreSQL 驅動靜態塊中可能:
log4j.properties 等)。| 方案 | 適用場景 | 代碼 |
|---|---|---|
| 啟動時預熱 | 所有場景 | 主線程啟動期調用 Class.forName,後續業務線程複用 |
| 使用 DriverManager 內建發現機制 (JDBC 4.0+) | 無特殊需求 | **刪除** Class.forName,直接 DriverManager.getConnection(url),SPI 自動加載 |
| 連接池預熱 | 生產環境 | HikariCP initializationFailTimeout=0 + minimumIdle>0,池啟動時建立連接觸發加載 |
| 異步預加載 | 啟動極度敏感 | CompletableFuture.runAsync(() -> Class.forName(...)) 後台加載 |
// 1. 依賴 JDBC 4.0 SPI,無需手動註冊
// 2. 數據源配置 (HikariCP 示例)
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://host:5432/db");
config.setUsername("user");
config.setPassword("pass");
config.setMinimumIdle(2); // 預熱 2 條連接
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);
// 3. 業務代碼極簡
try (Connection conn = ds.getConnection()) {
// 使用連接
}
**「卡住」實為「慢」**。JDBC 4.0 後
Class.forName純屬歷史包袱,**直接依賴 SPI 自動發現 + 連接池預熱** 是現代標準寫法,徹底規避首次加載延遲對業務線程的影響。