com.microsoft.sqlserver mssql-jdbc 12.4.2.jre11


telnet 127.0.0.1 1433 -- 僅剩游標閃爍 = 通;連線失敗 = 防火牆/NSG/埠號不符
| 場景 | 連線字串範例 |
|---|---|
| 標準 (SQL 驗證) | `jdbc:sqlserver://192.168.1.100:1433;databaseName=MyDB;user=sa;password=StrongP@ss;encrypt=true;trustServerCertificate=false;` |
| Windows 整合驗證 (Kerberos/NTLM) | `jdbc:sqlserver://192.168.1.100:1433;databaseName=MyDB;integratedSecurity=true;authenticationScheme=JavaKerberos;` |
| Always On 可用性群組 (多子網故障轉移) | `jdbc:sqlserver://ag-listener:1433;databaseName=MyDB;user=...;multiSubnetFailover=true;` |
| Azure SQL Database / Managed Instance | `jdbc:sqlserver://myserver.database.windows.net:1433;databaseName=MyDB;user=...;encrypt=true;trustServerCertificate=false;loginTimeout=30;` |
spring:
datasource:
url: jdbc:sqlserver://192.168.1.100:1433;databaseName=MyDB;encrypt=true;trustServerCertificate=false;
username: app_user
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: 20 # 核心數 * 2 為起點
minimum-idle: 5
idle-timeout: 300000 # 5 分鐘
max-lifetime: 1200000 # 20 分鐘
connection-timeout: 30000 # 30 秒
validation-timeout: 5000
leak-detection-threshold: 60000 # 1 分鐘洩漏偵測
connection-test-query: SELECT 1 # 驗證查詢 (Hikari 4+ 可省略)
pool-name: SQLServer-HikariCP
package com.example.demo;
import java.sql.*;
public class SqlServerJdbcDemo {
private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=MyDB;encrypt=true;trustServerCertificate=true;";
private static final String USER = "sa";
private static final String PASS = "StrongP@ssw0rd";
public static void main(String[] args) {
String sql = "SELECT TOP 5 name, create_date FROM sys.databases";
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
System.out.printf("%-30s %s%n", "Database", "Created");
while (rs.next()) {
System.out.printf("%-30s %s%n",
rs.getString("name"),
rs.getTimestamp("create_date"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
| `The TCP/IP connection to the host has failed` | 埠未開、防火牆、IP 錯誤、SQL 服務未啟用 TCP | 依「二、網路配置」逐項檢查 + `telnet` 驗證 |
| `Login failed for user 'sa'` | 密碼錯、sa 未啟用、混合模式未開啟 | SSMS 登入 → 伺服器屬性 → 安全性 → SQL Server 和 Windows 驗證模式 → 重啟服務 |
| `The driver could not establish a secure connection` | JDK 缺乏 TLS 1.2 支援、憑證不信任 | 升級 JDK 8u161+ / 11.0.1+;或暫時 `trustServerCertificate=true` (僅測試) |
| 中文亂碼 | 資料庫/欄位 Collation 非 Unicode、JDBC 未指定 `sendStringParametersAsUnicode=true` | 欄位用 `NVARCHAR`;連線字串加 `sendStringParametersAsUnicode=true` |
| 連線洩漏 / 池耗盡 | 未正確關閉 `Connection`/`PreparedStatement`/`ResultSet` | **全面使用 try-with-resources**;HikariCP `leakDetectionThreshold` |
原文提及 `sun.jdbc.odbc.JdbcOdbcDriver` + 系統 DSN,**JDK 8 已移除**,現代專案**禁止使用**。請直接使用 Microsoft 官方 JDBC 驅動 (Type 4 純 Java)。