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 (僅供舊系統維護參考)
步驟
- 建立系統 DSN (ODBC 管理員 → 系統 DSN → SQL Server 驅動程式)
- 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
| 參數 | 建議值 | 說明 |
selectMethod | cursor | 避免大結果集佔盡記憶體,啟用伺服器端游標 |
sendStringParametersAsUnicode | true | 參數以 NVARCHAR 傳輸,避免中文亂碼 |
applicationName | 應用名稱 | 方便 SQL Profiler/Activity Monitor 追蹤 |
encrypt | true | 強制 TLS 加密 (需伺服器憑證) |
trustServerCertificate | false | 生產環境必須驗證憑證 |
三、 替代方案: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 + 有效磁碟數 (經驗公式),依負載測試微調
五、 常見問題速查表
| 現象 | 原因 | 解決 |
| 中文亂碼 (???) | 資料庫欄位 varchar + 驅動預設 Unicode | 加 sendStringParametersAsUnicode=true 或改用 nvarchar |
| Connection reset | 防火牆/閒置超時切斷 | 啟用 connection-test-query、調整 idle-timeout < 防火牆逾時 |
| SSLHandshakeException | 伺服器強制加密、憑證不受信 | 匯入伺服器憑證到 JDK truststore、或 trustServerCertificate=true (僅測試) |
| Deadlock/Timeout | 長交易、缺少索引 | 啟用 READ_COMMITTED_SNAPSHOT、優化查詢、縮短交易範圍 |
| ClassNotFound: sqljdbc4 | JAR 未在 Classpath | Maven 依賴正確、打包為 Fat Jar / 放入容器 lib |
六、 遷移檢查清單 (JDBC-ODBC → 官方驅動)
- [ ] 移除
sun.jdbc.odbc.JdbcOdbcDriver 相關碼
- [ ] 引入
mssql-jdbc 或 jtds Maven 依賴
- [ ] 更新所有連線字串為 JDBC 格式
- [ ] 設定
sendStringParametersAsUnicode=true / charset=UTF-8
- [ ] 配置 HikariCP/Druid 連線池參數
- [ ] 整合測試:中文 CRUD、交易回滾、大結果集串流、並發壓測
- [ ] 部署驗證:防火牆、憑證、DNS/SPN、應用名稱可見於 Profiler
- 上一篇文章: SQL Server 安全規劃全攻略:驗證模式選擇、Web 環境隔離、最小權限與稽核實戰
- 下一篇文章: SQL Server 易混淆資料型別完整對照:char/varchar/text、datetime/smalldatetime、整數家族、decimal/numeric、float/real
Copyright ©
程式碼之家 All Rights Reserved