国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

使用 JOTM 向 Servlet 添加事務(wù)

2019-11-18 12:32:29
字體:
供稿:網(wǎng)友

  簡介
  J2EE 除了提供了 servlet 之外,還提供了大量的其它功能。Servlet 開發(fā)者們也許難得使用這些功能,不情愿也沒有時間用一個超出所需的大型 J2EE 服務(wù)器來替換自己的簡單的 servlet。然而,依據(jù)J2EE 的模塊化特征,有可能將負責特定 J2EE 功能的小組件整合到 servlet 容器里,以此來增強 WEB 應(yīng)用程序。其中之一就是事務(wù)。
  有關(guān) J2EE 事務(wù)的完整描述,您可以參考three ONjava articles。現(xiàn)在只需知道事務(wù)是資源的操作步驟(例如:數(shù)據(jù)庫),它由四個屬性定義,這四個屬性根據(jù)其首字母濃縮為 ACID:
  
  原子性
  事務(wù)的操作,或者是全部成功(此時提交事務(wù)),或者是全部不成功(此時回滾事務(wù)),謂之為 all-or-nothing 屬性。一個事務(wù)應(yīng)該被視為單個工作單元,在一個事務(wù)里面絕對不可能同時存在完成了的和沒有完成的操作。
  
  一致性
  完成了的事務(wù)將資源從一個有效狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€有效狀態(tài)。一致性的具體例子有:數(shù)據(jù)庫的參照完整性和表中的主鍵唯一性。
  
  獨立性
  在事務(wù)沒有提交之前,事務(wù)作用的共享資源的改變在事務(wù)之外是不可見的。獨立性確保了不同事務(wù)不會同時訪問正在更新的數(shù)據(jù)。
  
  持久性
  由事務(wù)提交的改變會永久存在。
  JOTM (Java Open Transaction Manager)是由ObjectWeb協(xié)會開發(fā)的功能完整的且資源開放的獨立的事務(wù)治理器。它提供了 JAVA 應(yīng)用程序的事務(wù)支持,而且與 JTA( JAVA 事務(wù) API)兼容。您可以在JOTM home page了解到更多的具體信息。在 TOMCAT(或其它 Servlet 容器)整合了 JOTM 后,jsp 和 servlet 的開發(fā)者們就可以獲得事務(wù)的優(yōu)勢輕而易舉的創(chuàng)建更多健壯的 web 應(yīng)用程序。
  為了突出事務(wù)是怎樣增強 web 應(yīng)用程序的,舉一個常用的例子, web 瀏覽器與客戶端交互的 ATM 。
  
  ATM 樣例:
  情景
  此例比較簡單:一個客戶想從 ATM 提款,輸入了他的客戶名稱,john_doe;想提款數(shù),$50。假如他的銀行帳戶上有足夠的錢并且在 ATM 機上有足夠的現(xiàn)金的話,應(yīng)用程序就能給他相當數(shù)目的現(xiàn)金,并從銀行帳戶上提出同樣的數(shù)目。否則,操作中斷,并且除出現(xiàn)錯誤信息之外,其他都不會改變。我們無需擔心安全問題,只是在猜想用戶是否正確授權(quán)。
  這是一個非常簡單的例子,但是假如不使用事務(wù),用別的方法執(zhí)行起來將會很難。客戶端操作將會涉及到兩個不同的資源:ATM 和客戶銀行帳號。它們會自動的在應(yīng)用程序設(shè)計中產(chǎn)生 ACID 問題。例如:假如在 ATM 上操作成功而在銀行帳戶上卻失敗(也許是因為交流失敗),客戶將會取到錢,但是他的帳戶將不會更新。對于銀行來說,這就虧大了。
  更糟的是,假如銀行帳戶更新了,但是由于一個錯誤阻止 ATM 傳送錢,客戶得不到現(xiàn)金,但是帳戶上卻提掉了這筆款。
  為了防止出現(xiàn)上述事故,在你的應(yīng)用程序里,你能夠 1) 聯(lián)系兩個資源,并告知兩者客戶執(zhí)行的所有當前操作,2) 詢問兩者是否能執(zhí)行操作,3)假如兩者都同意,則請求操作。即使這樣,此方法也不能謂之足夠健壯,因為,假如客戶帳戶上的錢在第二步和第三步的時候被另外一操作提走,提款可能會失敗,例如,客戶帳戶不能出現(xiàn)逆差。
  事務(wù)能使應(yīng)用程序更簡單更健壯的之處就是:在同一事務(wù)的兩個資源上執(zhí)行所有的操作的時候,它將會解決 ACID 的問題(尤其是原子性)。
  應(yīng)用程序設(shè)計
  
  數(shù)據(jù)層
  在數(shù)據(jù)層,有兩個不同的數(shù)據(jù)庫,并各自有一張表。為了使例子更接近實際,我們使用兩個不同的數(shù)據(jù)庫,因為有可能從 ATM 提走不是屬于該客戶帳戶的款(請參見下文配置數(shù)據(jù)庫)。
  • banktest 包含代表客戶帳號的 account 表。
  • atmtest包含代表 ATM 的 atm 表。
  
  邏輯層
  在邏輯層,有三個類來訪問資源和執(zhí)行操作:
  • foo.BankAccount 代表給定客戶的銀行帳號 account,并能通
  
  過 JDBC在 account 執(zhí)行數(shù)據(jù)庫操作。
  • bar.ATM 代表 ATM,并在 atm 表上執(zhí)行 JDBC 操作。
  • bar.CashDelivery 使用前面兩個類來執(zhí)行一個客戶操作。
  所有邏輯在 CashDelivery.java 的 deliverCash 方法中實現(xiàn)。
  javax.transaction.UserTransaction 接口用于劃分事務(wù)所有 utx.begin() 和 utx.commit() (或 utx.rollback())之間的操作在同一事務(wù)內(nèi)執(zhí)行。這確保了應(yīng)用程序不會受到如前述的遭遇。
  事務(wù)使得應(yīng)用程序更為簡單,由以下簡單的步驟組成:
  1. 開始事務(wù)。
  2. 聯(lián)系客戶的銀行帳戶并從帳戶上提款。
  3. 告訴 ATM 傳送錢。
  4. 完成事務(wù)。
  o 假如所有事件完成,提交事務(wù)。
  o 否則,回滾事務(wù)。
  5. 報告客戶事務(wù)結(jié)果。假如事務(wù)成功,現(xiàn)金將被提出,錢數(shù)也將從帳戶上提出。否則,一切都不會改變。
  例 1。. CashDelivery.java
  public boolean deliver(String client, int value) {
  InitialContext ctx     = new InitialContext();
  UserTransaction utx = (UserTransaction)
  ctx.lookup("java:comp/UserTransaction");
  
  ...
  
  boolean sUCcess = false;
  try {
  // 開始事務(wù)
  utx.begin();
  
  //聯(lián)系客戶銀行帳戶...
  BankAccount account = new BankAccount(client);
  
  // ... 從帳戶上提款
  account.withdraw(value);
  
  //聯(lián)系 ATM...
  ATM atm = new ATM();
  
  // ... 傳送現(xiàn)金給客戶
  atm.deliverCash(value);
  
  //一切正常
  success = true;
  
  } catch (Exception e) {
  // 出現(xiàn)故障,不得不
  // 報告給客戶
  eXPlanation += e.getMessage();
  
  } finally {
  try {
  if (success) {
  /*一切正常提交事務(wù)
  直到現(xiàn)在,錢才真正的從帳戶上提出,并且將現(xiàn)金傳送給客戶。
  */
  utx.commit();
  
  } else {
  /* 出現(xiàn)故障,就回滾事務(wù)。
  *所有在事務(wù)內(nèi)處理的操作不會發(fā)生。
  */
  utx.rollback();
  }
  } catch (Exception e) {
  /* 在完成事務(wù)的過程中出現(xiàn)故障,
  *仍然保證
  * 事務(wù)內(nèi)的操作不會發(fā)生。/
  */
  // 報告給客戶
  explanation += "/n" + e.getMessage();
  
  //最后,事務(wù)不會成功
  success = false;
  
  } finally {
  return success;
  }
  }
  }
  表示層
  在表示層,就用程序由兩個 JSP 文件組成:
  • atm.jsp, 應(yīng)用程序,它發(fā)送給bar.CashDelivery 類客戶登錄和提款數(shù)目,并顯示客戶操作的結(jié)果 。
  • admin.jsp,,用于顯示和更新兩個資源的信息。(它不屬于應(yīng)用程序設(shè)計的部分,但是添加它來簡化資源更新,比如處理客戶帳戶的錢數(shù)。)
  
  配置數(shù)據(jù)庫
  關(guān)于數(shù)據(jù)庫,建議使用 MySQL 4.0.12 和相應(yīng)的 JDBC 驅(qū)動程序。默認情況下,MySQL 表不會受影響。為支持事務(wù),表在創(chuàng)建的時候設(shè)置為 InnoDB 類型。另外,為啟用 InnoDB 類型,您可以將 MySQL 配置文件內(nèi)的 #skip-innodb 行注釋掉。
  
  已配置了一個 MySQL 的例子,用戶名為 javauser,密碼為 javadude。確保該用戶已被創(chuàng)建并且擁有創(chuàng)建數(shù)據(jù)庫的權(quán)限。
  創(chuàng)建數(shù)據(jù)庫和表的腳本在 scripts/ 目錄下的 example file 內(nèi)含有。它將創(chuàng)建一個 account 表并插入兩個客戶:
  • john_doe 他的帳戶金額為 $100。
  • jane_doe 他的帳戶金額為 $600。
  例2 創(chuàng)建 account 表
  mysql> CREATE DATABASE banktest;
  mysql> USE banktest;
  mysql> CREATE TABLE account(
  -> client VARCHAR(25) NOT NULL PRIMARY KEY,
  -> money INT) TYPE=InnoDB;
  mysql> INSERT INTO account valueS("john_doe", 100);
  mysql> INSERT INTO account valueS("jane_doe", 600);
  mysql> SELECT * FROM account;
  +----------+-------+
   client  money
  +----------+-------+
   john_doe   100
   jane_doe   600
  +----------+-------+
  腳本還會創(chuàng)建有 $500 可用現(xiàn)金的 atm 表。
  例3 創(chuàng)建 atm 表
  mysql> CREATE DATABASE atmtest;
  mysql> USE atmtest;
  mysql> CREATE TABLE atm(
  -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  -> cash INT) TYPE=InnoDB;
  mysql> INSERT INTO atm valueS(null, 500);
  mysql> SELECT * FROM atm;
  +----+------+
   id cash
  +----+------+
   1  500
  +----+------+
  最后,復制 $CATALINA_HOME/shared/lib 內(nèi)的 JDBC 驅(qū)動程序 .jar 文件。
  獲取并安裝 TOMCAT
  本章主要介紹 Tomcat 4.1.18 及以上的版本。首先確保沒有使用以前的舊版本,安裝 TOMCAT 沒有什么非凡,只需下載并解壓縮即可。
  獲取并安裝 JOTM
  假如要使用 JOTM,只需要下載最近的二元版本并將解壓縮即可。再從 lib/ 目錄下將.jar 文件(除了 log4j.jar、ommons-cli.jar 和 jotm_iiop_stubs.jar) 復制到 $CATALINA_HOME/shared/lib。這樣就完成了。
  配置 TOMCAT
  需要配置 Tomcat,使之能夠從 JNDI 獲取 UserTransaction 和 DataSource 對象(它們用在 foo.BankAccount 和 bar.ATM)。
  首先,告訴 TOMCAT 你所使用的 JNDI 名字,以便在 WEB 應(yīng)用程序中

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 馆陶县| 贡嘎县| 嘉义县| 屏东市| 句容市| 德昌县| 灵宝市| 涡阳县| 北票市| 临洮县| 海原县| 比如县| 宁南县| 葵青区| 黑山县| 徐汇区| 泰兴市| 黑龙江省| 密云县| 晋城| 环江| 晋江市| 清镇市| 宜兰市| 日照市| 恭城| 广河县| 临西县| 大理市| 行唐县| 河津市| 普兰店市| 康平县| 双江| 周口市| 准格尔旗| 正阳县| 洛南县| 扶沟县| 昭觉县| 顺平县|