連接 Microsoft SQL Server 是 Java 企業級開發的高頻需求。開源 jTDS 驅動以效能優異、規格完整、無原生庫依賴著稱,是 JDBC 連接 SQL Server 的首選方案。本文涵蓋環境變量配置、Maven/Gradle 依賴、連接代碼範例、Windows/SQL 混合認證切換、常見異常排查。
net.sourceforge.jtds:jtds:1.3.1 (最新穩定版)implementation 'net.sourceforge.jtds:jtds:1.3.1' net.sourceforge.jtds jtds 1.3.1
不要 手動拷貝到 JDK_HOME/jre/lib/ext 或修改系統 CLASSPATH 環境變量 —— 這是反模式,導致版本衝突、部署困難、IDE 識別失敗。
註冊表備選方案 (不推薦,僅作了解):HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\LoginMode = 2 (混合模式)。
import java.sql.*;
public class SqlServerConnect {
public static void main(String[] args) {
// 1. 連接字串參數
String host = "localhost"; // 或 192.168.1.100
int port = 1433; // 預設埠
String database = "YourDatabase"; // 目標資料庫
String user = "sa"; // SQL 登入帳號
String password = "yourPassword"; // 密碼
// 2. JDBC URL (jTDS 格式)
String url = String.format("jdbc:jtds:sqlserver://%s:%d/%s", host, port, database);
// 可選參數:;instance=SQLEXPRESS;encrypt=true;trustServerCertificate=true
String driver = "net.sourceforge.jtds.jdbc.Driver";
Connection conn = null;
try {
// 3. 載入驅動 (JDBC 4.0+ 可省略,DriverManager 會自動發現 META-INF/services/java.sql.Driver)
Class.forName(driver);
// 4. 建立連接
conn = DriverManager.getConnection(url, user, password);
System.out.println("連接成功!Catalog: " + conn.getCatalog());
// 5. 簡單驗證查詢
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT @@VERSION")) {
if (rs.next()) System.out.println("版本: " + rs.getString(1));
}
} catch (SQLException e) {
printSQLException(e);
} catch (ClassNotFoundException e) {
System.err.println("驅動類未找到,請檢查依賴: " + e.getMessage());
} finally {
closeQuietly(conn);
}
}
private static void printSQLException(SQLException e) {
System.err.println("SQLState: " + e.getSQLState());
System.err.println("Error Code: " + e.getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = e.getCause();
while (t != null) {
System.err.println("Cause: " + t.getMessage());
t = t.getCause();
}
}
private static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignored) {}
}
}
| 模式 | 連接字串 | 適用場景 |
|---|---|---|
| SQL Server Authentication | jdbc:jtds:sqlserver://host:1433/db;user=sa;password=xxx | 標準、跨網域、應用池身份、Docker 容器 |
| Windows Authentication (NTLM) | jdbc:jtds:sqlserver://host:1433/db;domain=YOUR_DOMAIN;useNTLMv2=true | 內網域環境、單一登入、服務帳號運行應用 |
| Windows Authentication (Kerberos) | jdbc:jtds:sqlserver://host:1433/db;useKerberos=true | 企業級 SSO、需 SPN 配置、Keytab |
| 異常/現象 | 原因 | 解決 |
|---|---|---|
ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver | 依賴未打包、Classpath 缺失 | Maven/Gradle 依賴、打包檢查 BOOT-INF/lib/jtds-*.jar |
Network error IOException: Connection refused | SQL Server 未啟用 TCP/IP、埠錯誤、防火牆攔截 | Configuration Manager 啟用 TCP/IP、確認 1433、telnet 測試 |
Login failed for user 'sa' | 密碼錯誤、帳號鎖定、未啟用 SQL 認證 | SSMS 重置密碼、啟用混合模式、檢查鎖定狀態 |
I/O Error: DB server closed connection | 驅動版本過舊不支援 TLS 1.2、Server 強制加密 | 升級 jTDS 1.3.1+、或 URL 加 ;encrypt=true;trustServerCertificate=true |
Instance not found | 連接命名實例 (SQLEXPRESS) 未指定 instance 參數 | URL 加 ;instance=SQLEXPRESS 或使用實例埠 |
maximumPoolSize、connectionTimeout、idleTimeoutPreparedStatement 防注入、計劃複用@Transactional (Spring) 或 Connection.setAutoCommit(false)mssql-jdbc (支援 Always Encrypted、Data Classification 等新特性)jTDS 以純 Java、高效能、標準相容成為連接 SQL Server 的經典選擇。核心成功要素:Maven 依賴管理、SQL Server TCP/IP 啟用、認證模式匹配、異常信息完整記錄。現代架構中,配合 HikariCP 連線池、Spring 事務管理、遷移至 Microsoft 官方驅動以支援新特性,構建穩健的資料存取層。