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

JDBC 2.0 核心新特性深度解析:DataSource、連接池、分布式事務與 RowSet

     編輯:Java 相關知識

JDBC 2.0:從「連接工具」到「企業級數據訪問標準」

JDBC 2.0 (JDK 1.2 / J2EE 1.2 引入) 將 API 拆分為核心包 (java.sql) 與標準擴展包 (javax.sql),標誌著 Java 數據訪問邁向企業級成熟期。本文深度解析四大核心新特性:DataSource、連接池、分布式事務 (XA)、RowSet,並揭示其背後的架構設計思想。

一、DataSource:告別硬編碼,擁抱 JNDI 與可移植性

DriverManager 的痛點

  • 驅動類名硬編碼 (Class.forName("oracle.jdbc.driver.OracleDriver"))。
  • 連接 URL、用戶/密碼散落業務代碼,遷移數據庫需改代碼重編譯。
  • 無內置連接池、分布式事務支持。

DataSource 設計精髓

// 管理員配置階段 (通常由容器/工具完成)
Context ctx = new InitialContext();
DataSource ds = new OracleDataSource(); // 廠商實現
ds.setURL("jdbc:oracle:thin:@host:1521:sid");
ds.setUser("scott");
ds.setPassword("tiger");
// 綁定到 JNDI
ctx.bind("jdbc/InventoryDB", ds);

// 應用代碼階段 (零硬編碼)
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/InventoryDB");
Connection conn = ds.getConnection(); // 或 getConnection(user, pwd)

核心優勢

維度DriverManagerDataSource
可移植性低 (驅動/URL 硬編碼)高 (邏輯名稱 jdbc/xxx)
維護性改配置需改代碼改 JNDI 綁定屬性即可,代碼不變
企業級特性無原生支持連接池、XA 事務
安全性密碼明文在代碼憑證由容器管理,代碼無敏感信息

二、連接池:性能提升的「隱形引擎」

原理:DataSource.getConnection() 返回的不一定是物理新連接,而是來自池的邏輯連接句柄。conn.close() 不銷毀物理連接,而是歸還池中。

透明獲取池化連接

// 應用代碼完全不變!
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/EmployeeDB"); // 此 DataSource 內部配置了池
Connection con = ds.getConnection("user", "pwd"); // 從池獲取

try {
    // 業務操作...
} finally {
    // 關鍵:必須在 finally 中 close,歸還連接給池
    if (con != null) con.close(); 
}

底層實現協議 (廠商透明實現)

  • ConnectionPoolDataSource:池管理器調用,生成 PooledConnection (物理連接包裝)。
  • PooledConnection.getConnection():返回邏輯 Connection 句柄給應用。
  • ConnectionEventListener:池監聽句柄關閉事件,回收物理連接。

開發者無需直接調用以上接口,僅需確保 finally { conn.close(); } 習慣。

三、分布式事務 (XA):跨數據源的 ACID 守護者

場景

單一業務需同時更新 Oracle 訂單庫、MySQL 庫存庫、MQ 消息隊列,要求全部成功或全部回滾。

JTA/XA 架構角色

  • 應用:獲取 XA 連接,執行 SQL,不調用 commit/rollback/setAutoCommit。
  • 事務管理器 (TM):如 WebLogic TM, JBoss TM, Atomikos。協調全局事務,發起兩階段提交 (2PC)。
  • 資源管理器 (RM):數據庫、MQ 等實現 XAResource 接口。
  • XADataSource:廠商提供,生成 XAConnection -> XAResource。

應用代碼模式 (JTA 標準)

// 1. 獲取 UserTransaction (JNDI 或 @Resource 注入)
UserTransaction utx = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction");

try {
    utx.begin(); // 開啟全局事務
    
    // 2. 從不同 XA DataSource 獲取連接 (自動加入全局事務)
    Connection conn1 = ds1.getConnection(); // Oracle
    Connection conn2 = ds2.getConnection(); // MySQL
    
    // 3. 業務操作 (不可手動 commit/rollback)
    stmt1.executeUpdate("INSERT INTO orders ...");
    stmt2.executeUpdate("UPDATE inventory SET qty = qty - 1 ...");
    
    // 4. 提交全局事務 (TM 協調 2PC)
    utx.commit(); 
} catch (Exception e) {
    utx.rollback(); // 失敗回滾
}

關鍵約束

  • XA 連接 默認 auto-commit = false。
  • 嚴禁在 XA 事務中調用 conn.commit(), conn.rollback(), conn.setAutoCommit(true)。
  • 同一連接可在不同事務上下文間切換 (TM 管理)。

四、RowSet:斷開連接的可序列化數據集

定位

RowSet 繼承 ResultSet,是 JavaBeans 組件,支持:

  • 斷開模式:獲取數據後關閉連接,對象輕量可序列化傳輸 (適合瘦客戶端/網絡傳輸)。
  • 事件通知:RowSetListener 監聽游標移動、行變更、行集變更,GUI 綁定極佳。
  • 多數據源填充:不限於 JDBC,可從 CSV、XML、Excel 等表格數據源填充。
  • 樂觀鎖更新:斷開後修改,重連時自動生成 WHERE 子句檢測衝突。

主流實現類型 (JSR-114 / JDBC RowSet 2.0)

類型連接模式適用場景
CachedRowSet斷開通用緩存、序列化傳輸、瘦客戶端
JdbcRowSet連接ResultSet 的 JavaBeans 包裝,支持滾動/更新
WebRowSet斷開XML 序列化 (含 Schema/數據),Web Service 傳輸
JoinRowSet斷開內存中多 RowSet 類 SQL JOIN
FilteredRowSet斷開內存中行過濾 (Predicate)

代碼示例:CachedRowSet 斷開操作

// 1. 創建並配置 (通常由容器注入或工廠創建)
CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
crs.setUrl("jdbc:mysql://localhost/db");
crs.setUsername("user");
crs.setPassword("pwd");
crs.setCommand("SELECT id, name, price FROM products");

// 2. 獲取數據 (內部自動打開/關閉連接)
crs.execute(); 

// 3. 斷開環境下操作 (可序列化傳遞給前端)
crs.beforeFirst();
while (crs.next()) {
    System.out.println(crs.getString("name"));
    // 修改數據
    if (crs.getInt("id") == 100) {
        crs.updateDouble("price", 99.9);
        crs.updateRow();
    }
}

// 4. 重新連接同步更新 (樂觀鎖)
crs.acceptChanges(); // 內部重新獲取連接執行 UPDATE ... WHERE id=100 AND price=old_price

總結

JDBC 2.0 通過 DataSource 抽象層 統一了「獲取連接」的入口,將連接池、分布式事務、RowSet 等企業級能力封裝在廠商實現中,實現了應用代碼零修改即可獲得高級特性的設計目標。這正是現代連接池 (HikariCP, Druid)、Spring DataSource 抽象、JTA 實現 (Atomikos, Narayana) 的架構藍圖。

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