驅動包演進時間軸
| 時代 | 驅動包 | Maven 坐標 | 支援版本 | 狀態 |
| 早期 (2000s) | jTDS | net.sourceforge.jtds:jtds | SQL Server 6.5 - 2008 | 停止維護 (2013 年最後更新) |
| Microsoft 早期 | msbase.jar, mssqlserver.jar, msutil.jar | 無 (手動安裝) | SQL Server 2000 | 已淘汰 |
| JDBC 2.0 階段 | sqljdbc.jar | com.microsoft.sqlserver:sqljdbc | 2005, 2008, 2012 | 需手動 Class.forName |
| JDBC 4.0+ 階段 | sqljdbc4.jar / mssql-jdbc.jar | com.microsoft.sqlserver:mssql-jdbc | 2008 - 2022, Azure SQL | **現行推薦**,支援 SPI 自動載入 |
核心差異:sqljdbc.jar vs sqljdbc4.jar (mssql-jdbc.jar)
sqljdbc.jar (JDBC 3.0 相容)
- 需手動註冊驅動:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
- 適用 JDK 1.5/1.6 環境
- 不支援
java.sql.Driver SPI 機制
sqljdbc4.jar / mssql-jdbc.jar (JDBC 4.0+ 相容)
- 零配置自動載入:JAR 內含
META-INF/services/java.sql.Driver,列出 com.microsoft.sqlserver.jdbc.SQLServerDriver
DriverManager.getConnection(url) 直接可用,無需 Class.forName
- 需 JDK 6.0+ (JRE 6+)
- 向下相容:舊代碼的
Class.forName 仍可工作
Maven 依賴配置 (現行最新版本)
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre11</version> <!-- 依 JDK 版本選擇 jre8/jre11/jre17 -->
</dependency>
版本選擇對照
| JDK 版本 | 建議驅動版本後綴 | 範例 |
| JDK 8 | .jre8 | 12.4.2.jre8 |
| JDK 11 | .jre11 | 12.4.2.jre11 |
| JDK 17/21 | .jre17 | 12.4.2.jre17 |
連線字串最佳實踐
// 基本連線 (信任憑證需額外配置)
String url = "jdbc:sqlserver://localhost:1433;databaseName=MyDB;encrypt=true;trustServerCertificate=true;";
// 生產環境建議:連線池 + 完整參數
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:sqlserver://prod-db:1433;databaseName=AppDB;" +
"encrypt=true;trustServerCertificate=false;" +
"loginTimeout=10;socketTimeout=30;" +
"applicationName=MyApp;"); // 便於 DBA 追蹤
config.setUsername("app_user");
config.setPassword("secure_pwd");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
DataSource ds = new HikariDataSource(config);
常見問題排查
| 錯誤現象 | 原因 | 解決方案 |
No suitable driver found | 驅動未載入、Maven 依賴缺失、JAR 衝突 | 檢查 mvn dependency:tree、確認 mssql-jdbc 存在、排除舊 sqljdbc |
The driver could not establish a secure connection | SQL Server 強制加密、憑證不受信 | 加 encrypt=true;trustServerCertificate=true (測試) 或配置正規憑證 (生產) |
Login failed for user | 認證模式錯誤 (SQL vs Windows)、密碼錯誤 | 確認 SQL Server 混合模式啟用、檢查用戶映射、嘗試 integratedSecurity=true (Windows 域) |
類別衝突 java.lang.LinkageError | 同時存在 jTDS 與 Microsoft 驅動 | 排除 jTDS,統一用 Microsoft 官方驅動 |
遷移清單:從 jTDS 升級
- 移除
jtds 依賴
- 新增
mssql-jdbc 依賴 (對應 JDK 版本)
- 更新驅動類名:
net.sourceforge.jtds.jdbc.Driver → com.microsoft.sqlserver.jdbc.SQLServerDriver (或移除手動載入)
- 調整連線 URL 格式:
jdbc:jtds:sqlserver:// → jdbc:sqlserver://
- 測試資料型別對應:
datetime → datetime2、text → nvarchar(max)
- 驗證預存程序呼叫語法:
{call proc(?,?)} 相容
總結
**2024 年唯一推薦**:com.microsoft.sqlserver:mssql-jdbc (JDBC 4.2+ 相容)。零配置、官方維護、支援最新 SQL Server/Azure 功能、定期安全更新。舊專案務必規劃遷移,避免使用已停止維護 10 年的 jTDS。
- 上一篇文章: Java 入門必懂的三大核心觀念:引用本質、== vs equals、String 不變性
- 下一篇文章: Java 抽象類別 vs 介面:語法、設計哲學與選型決策完全解析
Copyright ©
程式碼之家 All Rights Reserved