Java 連接 SQL Server 時,驅動類別名、連線字串格式、JAR 依賴隨版本差異極大,且網路協定(TCP/IP、Named Pipes)配置錯誤頻繁導致連線失敗。本文彙整 SQL Server 2000/2005/2008+ 至最新版的驅動對應表、連線字串範本、TCP/IP 啟用步驟與常見異常排查清單。
The TCP/IP connection to the host localhost, port 1433 has failed.
Error: Connection refused: connect
根因:SQL Server 預設**未啟用 TCP/IP 協定**,或防火牆阻擋埠口。
解決步驟:
Protocols for MSSQLSERVER)。IPAll 或對應 IP → 設定 TCP Port = 1433(或自訂埠),清空 TCP Dynamic Ports。SQL Server (MSSQLSERVER))。| SQL Server 版本 | 驅動類別名 | 連線字串範本 | 必要 JAR |
|---|---|---|---|
| SQL Server 2000 | sun.jdbc.odbc.JdbcOdbcDriver(JDBC-ODBC Bridge,Java 8 移除) | jdbc:odbc:<DSN名> | mssqlserver.jar, msutil.jar, msbase.jar (Microsoft JDBC 2000 版) |
| SQL Server 2005 | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://<host>:1433;DatabaseName=<db> | sqljdbc.jar (Microsoft JDBC Driver 1.2 for SQL Server 2005) |
| SQL Server 2008/2008 R2 | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://<host>:1433;DatabaseName=<db> | sqljdbc4.jar (JDBC 3.0, Java 6+) |
| SQL Server 2012/2014/2016/2017/2019/2022 | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://<host>:1433;DatabaseName=<db>;encrypt=true;trustServerCertificate=true | mssql-jdbc-12.x.x.jre11.jar (最新 Microsoft JDBC Driver 12.x, Java 8/11/17) |
String url = "jdbc:sqlserver://192.168.1.100:1433;" +
"databaseName=MyDB;" +
"encrypt=true;" +
"trustServerCertificate=true;" + // 測試環境自簽憑證用;生產請配置信任憑證
"loginTimeout=30;" +
"socketTimeout=30;";
String user = "app_user";
String password = "strongPassword";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 連線成功
System.out.println("連線成功: " + conn.getMetaData().getDatabaseProductVersion());
} catch (SQLException e) {
// 統一錯誤處理
throw new RuntimeException("資料庫連線失敗", e);
}
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre11</version> <!-- 對應 Java 11/17 -->
</dependency>
| 異常訊息 | 原因 | 解決 |
|---|---|---|
| No suitable driver found | 驅動類別名錯誤/JAR 未在 classpath | 檢查 Class.forName、Maven 依賴、Fat JAR 合併策略 |
| Login failed for user | 帳號/密碼錯誤/權限不足 | 確認 SQL Server 驗證模式、使用者對應資料庫權限 |
| The driver could not establish a secure connection | encrypt=true 但憑證不受信 | 生產環境匯入 CA 憑證;測試環境加 trustServerCertificate=true |
| Connection reset | 網路中斷/防火牆/Idle timeout | 檢查防火牆、設定 socketTimeout、啟用連線池驗證查詢 |
| Java 8/11/17 版本不相容 | JDBC 驅動 JRE 版本與執行環境不符 | 選擇對應 jre8/jre11/jre17 後綴的 JAR |
PreparedStatement 防 SQL 注入、執行計畫重用。conn.setAutoCommit(false) 手動控制事務。validationQuery=SELECT 1 防止斷連。encrypt=true 並配置信任憑證。