首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Java 連線 SQL Server 2008/2012+ 完整配置指南:JDBC 驅動、TCP/IP 埠、連線池最佳實踐

     編輯:關於SqlServer

一、JDBC 驅動準備

  • 下載:Microsoft 官網 **Microsoft JDBC Driver for SQL Server** (目前 12.x 支援 SQL 2005~2022)。
  • Jar 檔:`mssql-jdbc-.jre8.jar` (Java 8+)、`mssql-jdbc-.jre11.jar` (Java 11+)。**單一 Jar 即可**,無需區分 `sqljdbc4.jar`/`sqljdbc.jar`。
  • Maven 依賴:
    
        com.microsoft.sqlserver
        mssql-jdbc
        12.4.2.jre11 
    

二、SQL Server 網路配置 (關鍵步驟)

  1. 開啟 **SQL Server 組態管理員**。
  2. 「SQL Server 網路組態」→ 選擇執行個體 (預設 `MSSQLSERVER`) → 「TCP/IP」右鍵「啟用」。
  3. 右鍵「TCP/IP」→「屬性」→「IP Addresses」分頁:
    • IPAll 區段:
    • **TCP 動態連接埠**:清空 (刪除 0)。
    • **TCP 連接埠**:輸入 **1433** (或自訂埠)。
  4. 「SQL Server 服務」→ 重啟 `SQL Server (MSSQLSERVER)` 服務。

組態管理員 TCP/IP 啟用

IPAll 設定固定埠 1433

驗證埠通

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;`

關鍵參數解析

  • `encrypt=true`:**生產環境強制加密傳輸** (TLS 1.2+)。
  • `trustServerCertificate=false`:生產需有效 CA 憑證;開發/測試可設 `true` 跳過驗證。
  • `loginTimeout` / `socketTimeout`:防止網路抖動導致無限阻塞。
  • `applicationName`:設定應用名稱,利於 SSMS `sp_who2` / Profiler 追蹤識別來源。

四、連線池配置 (HikariCP 推薦)

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

五、完整 Java 程式碼範例 (JDBC 4.2 try-with-resources)

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`

七、舊版 ODBC-JDBC Bridge (僅歷史參考,勿用於新專案)

原文提及 `sun.jdbc.odbc.JdbcOdbcDriver` + 系統 DSN,**JDK 8 已移除**,現代專案**禁止使用**。請直接使用 Microsoft 官方 JDBC 驅動 (Type 4 純 Java)。

總結

  1. **官方 JDBC 驅動** (單一 Jar) + **固定 TCP 1433** + **加密連線** = 穩健基石。
  2. **HikariCP** 連線池 + **try-with-resources** = 高效零洩漏。
  3. **Always On / Azure** 專用參數 (`multiSubnetFailover`, `loginTimeout`) 依部署架構啟用。
  4. 遇到連線失敗:**`telnet` → 防火牆/NSG → SQL 組態管理員 → 驗證模式 → 憑證** 五步排查法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved