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

SQL Server 2000 + JDBC 整合常見問題與解決方案:驅動選擇、連線池、字元編碼完整指南

     編輯:關於SqlServer

Java 應用整合 SQL Server 2000 時,驅動程式選擇、JDBC-ODBC 橋接效能、字元集設定、連線池配置是四大常見坑點。本文提供完整遷移指南,從舊版 JDBC-ODBC 到 Microsoft 官方 JDBC Driver / jTDS 最佳實踐。

環境基線

  • 資料庫:SQL Server 2000 SP3/SP4
  • JDK:1.4+ (建議 1.6+)
  • 驅動選擇優先序:Microsoft JDBC Driver 4.0+ (sqljdbc4.jar) > jTDS 1.3.1 > JDBC-ODBC Bridge (已移除 JDK 8+)

一、 歷史方案:JDBC-ODBC Bridge (僅供舊系統維護參考)

步驟

  1. 建立系統 DSN (ODBC 管理員 → 系統 DSN → SQL Server 驅動程式)
  2. Java 碼:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); DriverManager.getConnection("jdbc:odbc:DSN名", "user", "pwd")

缺點

  • 效能差 (雙層轉譯)、執行緒不安全、JDK 8 起移除、64 位元相容性差
  • **生產環境嚴禁使用**

二、 推薦方案:Microsoft JDBC Driver (sqljdbc4.jar)

Maven 依賴

<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>7.4.1.jre8</version> <!-- 對應 JDK 版本 -->
</dependency>

連線字串最佳實踐

jdbc:sqlserver://host:1433;databaseName=MyDB;selectMethod=cursor;sendStringParametersAsUnicode=true;applicationName=MyApp
參數建議值說明
selectMethodcursor避免大結果集佔盡記憶體,啟用伺服器端游標
sendStringParametersAsUnicodetrue參數以 NVARCHAR 傳輸,避免中文亂碼
applicationName應用名稱方便 SQL Profiler/Activity Monitor 追蹤
encrypttrue強制 TLS 加密 (需伺服器憑證)
trustServerCertificatefalse生產環境必須驗證憑證

三、 替代方案:jTDS (開源、輕量、效能優)

jdbc:jtds:sqlserver://host:1433/MyDB;charset=UTF-8;domain=MYDOMAIN;useNTLMv2=true
  • 支援 NTLMv2/Kerberos 整合驗證 (Microsoft 驅動早期版本不支援)
  • 連線池整合優異 (Tomcat DBCP, HikariCP, Druid 皆相容)
  • **注意**:jTDS 1.3.1 為最終版,不再維護,新專案建議用 Microsoft 官方驅動

四、 連線池配置 (HikariCP 範例)

# application.properties (Spring Boot)
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.pool-name=SQLServerPool
spring.datasource.hikari.connection-test-query=SELECT 1
  • connection-test-query 必須輕量 (SELECT 1),避免頻繁喚醒資料庫
  • 池大小 = CPU 核心數 × 2 + 有效磁碟數 (經驗公式),依負載測試微調

五、 常見問題速查表

六、 遷移檢查清單 (JDBC-ODBC → 官方驅動)

  1. [ ] 移除 sun.jdbc.odbc.JdbcOdbcDriver 相關碼
  2. [ ] 引入 mssql-jdbc 或 jtds Maven 依賴
  3. [ ] 更新所有連線字串為 JDBC 格式
  4. [ ] 設定 sendStringParametersAsUnicode=true / charset=UTF-8
  5. [ ] 配置 HikariCP/Druid 連線池參數
  6. [ ] 整合測試:中文 CRUD、交易回滾、大結果集串流、並發壓測
  7. [ ] 部署驗證:防火牆、憑證、DNS/SPN、應用名稱可見於 Profiler
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
中文亂碼 (???)資料庫欄位 varchar + 驅動預設 Unicode加 sendStringParametersAsUnicode=true 或改用 nvarchar
Connection reset防火牆/閒置超時切斷啟用 connection-test-query、調整 idle-timeout < 防火牆逾時
SSLHandshakeException伺服器強制加密、憑證不受信匯入伺服器憑證到 JDK truststore、或 trustServerCertificate=true (僅測試)
Deadlock/Timeout長交易、缺少索引啟用 READ_COMMITTED_SNAPSHOT、優化查詢、縮短交易範圍
ClassNotFound: sqljdbc4JAR 未在 ClasspathMaven 依賴正確、打包為 Fat Jar / 放入容器 lib