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

輕量級事務管理:在 Tomcat 中整合 JOTM 為 Servlet 添加 ACID 保障

     編輯:Java 相關知識

為何 Servlet 需要事務?

J2EE 提供豐富功能,但開發者常不願為簡單 Servlet 引入龐大應用伺服器。利用 J2EE 模組化特性,可將特定功能(如事務管理)的小型組件整合進 Servlet 容器,增強 Web 應用健壯性。JOTM (Java Open Transaction Manager) 為 ObjectWeb 開發的功能完整、開源獨立事務管理器,相容 JTA (Java Transaction API),整合後即可在 Tomcat 中輕鬆獲得事務優勢。

事務核心:ACID 特性

  • 原子性:全成功或全失敗,視為單一工作單元。
  • 一致性:完成事務將資源從一個有效狀態轉為另一個有效狀態(如資料庫參考完整性、主鍵唯一性)。
  • 隔離性:未提交前,共享資源變更對外不可見,確保不同事務不同時存取更新中資料。
  • 持久性:提交的變更永久保存。

實戰場景:ATM 提款系統

客戶 John Doe 欲提款 $50,涉及兩資源:ATM 現金與銀行帳戶。無事務時,若 ATM 出鈔成功但帳戶扣款失敗(通訊故障),銀行虧損;若帳戶扣款成功但 ATM 未出鈔,客戶損失。事務確保兩資源操作在同一 ACID 邊界內,要么全成要么全敗。

應用架構設計

  • 資料層:兩獨立資料庫:`banktest`(`account` 表)、`atmtest`(`atm` 表),均用 InnoDB 支援事務。
  • 邏輯層:三類別:`foo.BankAccount`(帳戶 JDBC 操作)、`bar.ATM`(ATM JDBC 操作)、`bar.CashDelivery`(協調業務流程)。核心邏輯在 `CashDelivery.deliverCash()` 中,使用 `javax.transaction.UserTransaction` 劃定事務邊界:`utx.begin()` → 業務操作 → `utx.commit()`/`utx.rollback()`。
  • 表示層:兩 JSP:`atm.jsp`(提款介面)、`admin.jsp`(資源管理)。

圖1 應用程序設計

關鍵配置步驟

1. 資料庫準備

MySQL 4.0.12+,啟用 InnoDB(註釋 `skip-innodb`),建立 `javauser`/`javadude` 用戶。執行腳本建表、插入測試資料(John Doe $100、Jane Doe $600、ATM $500)。JDBC 驅動放入 `$CATALINA_HOME/shared/lib`。

2. 安裝 JOTM

下載二進制包解壓,將 `lib/` 下 jar(除 `log4j.jar`、`commons-cli.jar`、`jotm_iiop_stubs.jar`)複製至 `$CATALINA_HOME/shared/lib`。

3. 配置 Tomcat (web.xml + bank.xml)

web.xml 宣告資源參考:`jdbc/bankAccount`、`jdbc/ATM`(類型 `javax.sql.DataSource`)。

bank.xml (Context 配置) 定義實際資源:

  • DataSource 工廠:`org.objectweb.jndi.DataSourceFactory`,配置 JDBC URL、用戶、密碼、驅動類別。
  • UserTransaction 工廠:`org.objectweb.jotm.UserTransactionFactory`,設定 `jotm.timeout=60` 秒。

4. 部署與啟動

將 `bank.war`、`bank.xml` 放入 `$CATALINA_HOME/webapps`,啟動 Tomcat。首次存取 DataSource 時 JOTM 自動啟動(日誌顯示 `JOTM started`)。訪問 `https://localhost:8080/bank/` 使用應用。

功能驗證

  • John Doe 提 $400 → 失敗(帳戶餘額不足 $100)
  • Jane Doe 提 $550 → 失敗(ATM 現金不足 $500)
  • John Doe 提 $50 → 成功(取款、扣款雙雙生效)

JOTM 進階優勢

  • 完全分散式事務支援:跨 JVM 事務傳播(RMI/JRMP、RMI/IIOP)。
  • JDBC 整合:內建 XAPool(XA 相容連線池),滿足 JTA 事務需 XA 資源要求。
  • JMS 整合:結合 JORAM 實現事務性訊息收發,同一事務中可同時發送 JMS 訊息與更新資料庫。
  • Web 服務事務:提供 BTP (Business Transaction Protocol) 介面,為 Web 服務添加事務行為。

所有範例與文檔可在 JOTM 官網獲取。Tomcat + JOTM 組合讓輕量級 Servlet 容器輕鬆擁有企業級事務能力。

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