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

JDBC 入門指南(二):驅動載入與資料庫連線建立完整解析

     編輯:關於JSP

核心兩步驟:載入驅動 → 取得連線

JDBC 連線流程極其精簡,但細節決定成敗。本篇深入剖析每一步的機制、寫法演進與最佳實踐。

步驟一:載入 JDBC 驅動程式

傳統寫法(JDBC 4.0 前)

// MySQL 範例
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();

// Oracle 範例
Class.forName("oracle.jdbc.driver.OracleDriver");

// PostgreSQL 範例
Class.forName("org.postgresql.Driver");

// SQL Server 範例
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Class.forName() 觸發類別載入,靜態區塊中驅動類別會向 DriverManager 註冊自身。.newInstance() 確保實例化(舊版驅動需要)。

現代寫法(JDBC 4.0+,JDK 6+):零配置自動載入

驅動 JAR 的 META-INF/services/java.sql.Driver 檔案列出實作類別,DriverManager 初始化時透過 ServiceLoader 自動發現並註冊。

// 直接取得連線,無需顯式 Class.forName
Connection conn = DriverManager.getConnection(url, user, pass);

建議:保留 Class.forName() 可提早發現驅動遺漏(啟動時拋出異常),而非首次連線時才失敗。

步驟二:建立資料庫連線

標準連線語法

Connection conn = DriverManager.getConnection(jdbcUrl, username, password);

JDBC URL 結構解析

jdbc::
  • jdbc:固定協定前綴
  • subprotocol:驅動識別碼(如 mysql、postgresql、oracle)
  • subname:資料庫定位資訊(主機、埠、資料庫名、參數)

主流資料庫 URL 範例

資料庫URL 範例關鍵參數
MySQLjdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Taipei&useSSL=false&allowPublicKeyRetrieval=true時區、SSL、公開金鑰擷取
PostgreSQLjdbc:postgresql://localhost:5432/mydb?currentSchema=publicSchema 設定
Oracle (Thin)jdbc:oracle:thin:@//localhost:1521/ORCLPDB1Easy Connect 語法
Oracle (SID)jdbc:oracle:thin:@localhost:1521:ORCL傳統 SID 語法
SQL Serverjdbc:sqlserver://localhost:1433;databaseName=mydb;encrypt=true;trustServerCertificate=true加密、信任憑證
H2 (檔案)jdbc:h2:file:./data/mydb;AUTO_SERVER=TRUE嵌入式、多連線
H2 (記憶體)jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1測試專用

連線屬性替代方案:Properties 物件

Properties props = new Properties();
props.setProperty("user", "admin");
props.setProperty("password", "secret");
props.setProperty("characterEncoding", "UTF-8");
props.setProperty("useUnicode", "true");
props.setProperty("autoReconnect", "true");
props.setProperty("connectTimeout", "5000");
props.setProperty("socketTimeout", "30000");

Connection conn = DriverManager.getConnection(jdbcUrl, props);

此方式支援更多進階屬性,程式碼可讀性較高。

DriverManager 內部機制

DriverManager 維護已註冊驅動清單。呼叫 getConnection 時:

  1. 遍歷已註冊驅動
  2. 呼叫各驅動的 connect(url, props) 方法
  3. 第一個回傳非 null Connection 的驅動獲勝
  4. 若皆回傳 null,拋出 SQLException: No suitable driver found

因此 URL 格式必須精確匹配目標驅動的預期模式。

連線物件生命週期管理

// 正確模式:try-with-resources (JDK 7+)
try (Connection conn = DriverManager.getConnection(url, props)) {
    // 使用連線
    // 區塊結束自動關閉,即使拋出異常
} catch (SQLException e) {
    // 錯誤處理
}

嚴禁:長期持有連線不關閉、靜態變數儲存連線、跨執行緒共用單一連線(非執行緒安全)。

實務常見錯誤與解決

錯誤現象原因解決
No suitable driver found for jdbc:mysql://...驅動未載入、URL 拼寫錯誤檢查依賴、驗證 URL 格式
Access denied for user 'root'@'localhost'帳密錯誤、權限不足、主機不符確認用戶存在、GRANT 權限、FLUSH PRIVILEGES
Communications link failure網路不通、防火牆、MySQL 關閉、埠錯誤ping/telnet 測試、檢查 bind-address=0.0.0.0
Server timezone value '...' is unrecognized時區 ID 不相容URL 加 serverTimezone=Asia/Taipei
Public Key Retrieval is not allowedMySQL 8 caching_sha2_passwordURL 加 allowPublicKeyRetrieval=true 或改用 native password

連線池預覽

生產環境絕不直接使用 DriverManager 逐條建立連線。下一階段將介紹:

  • HikariCP(高效能、預設 Spring Boot 2+)
  • Druid(阿里巴巴、監控強)
  • Apache DBCP2 / Tomcat JDBC Pool
  • 連線池核心參數:最大/最小連線、取得超時、閒置驗證、洩漏偵測

結語

掌握驅動載入機制與 URL 結構,是 JDBC 開發的基石。現代框架(Spring Data、MyBatis、JOOQ)底層皆建立在此機制之上,理解原理有助於排查疑難雜症與效能調優。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved