亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用 JOTM 向 Servlet 添加事務

2019-11-18 12:32:29
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av快播网址| 国产日韩综合一区二区性色av| 日韩精品免费电影| 91国产高清在线| 日韩av三级在线观看| 日本国产精品视频| 日av在线播放中文不卡| 国产有码在线一区二区视频| 欧美精品国产精品日韩精品| 亚洲一区二区三区在线免费观看| 亚洲成人精品视频在线观看| 91在线|亚洲| 久久91亚洲人成电影网站| 国产成人综合亚洲| 日本韩国欧美精品大片卡二| 亚洲午夜av久久乱码| 欧美在线www| 日韩国产欧美精品在线| 在线观看久久久久久| 成人a视频在线观看| 亚洲欧美日韩视频一区| 日韩av第一页| 中文字幕综合在线| 欧美成人在线免费视频| 欧美黑人巨大精品一区二区| 国产91精品高潮白浆喷水| 精品一区二区三区三区| 91亚洲精品久久久| 91av视频在线播放| 欧美成人精品三级在线观看| 成人国内精品久久久久一区| 97在线看福利| 日本乱人伦a精品| 亚洲免费视频在线观看| 91亚洲精品一区二区| 欧美一区二区三区精品电影| 国产成人精品电影久久久| 1769国产精品| 亚洲аv电影天堂网| 97在线观看免费高清| 日本免费久久高清视频| 亚洲一区二区在线播放| 日韩h在线观看| 深夜福利亚洲导航| 欧美国产日韩视频| 亚洲女成人图区| 欧美最猛性xxxxx亚洲精品| 国产在线一区二区三区| 国产精品中文字幕在线观看| 久久久免费在线观看| 午夜精品一区二区三区视频免费看| 日韩av不卡电影| 久久香蕉频线观| 日韩免费观看在线观看| 久久精品国产2020观看福利| 性欧美长视频免费观看不卡| 国产精品三级美女白浆呻吟| 日韩中文字幕视频在线观看| 亚洲欧洲在线免费| 国产视频精品自拍| 久久久欧美精品| 欧美精品aaa| 成人有码视频在线播放| 色爱av美腿丝袜综合粉嫩av| 福利二区91精品bt7086| 欧美激情精品久久久久久黑人| 精品色蜜蜜精品视频在线观看| 国产日韩欧美在线看| 精品国产一区二区三区久久狼5月| 黄色成人av网| 中文字幕亚洲一区在线观看| 亚洲成人国产精品| 91亚洲va在线va天堂va国| 国产91在线高潮白浆在线观看| 国产精品尤物福利片在线观看| 福利一区视频在线观看| 亚洲国产精品久久久久久| 国产精品999999| 日韩在线播放一区| 久久露脸国产精品| 色久欧美在线视频观看| 久久夜色精品国产亚洲aⅴ| 欧美日韩成人免费| 日韩在线免费观看视频| 国外成人性视频| 欧美性猛xxx| 色先锋久久影院av| 国产精品久久久久久久久久免费| 国产色婷婷国产综合在线理论片a| 亚洲女性裸体视频| 亚洲精品一区久久久久久| 亚洲女人天堂色在线7777| 日韩欧美在线观看视频| 欧美老女人bb| 国产盗摄xxxx视频xxx69| 91天堂在线观看| 成人午夜高潮视频| 精品欧美激情精品一区| 成人免费直播live| 欧美精品久久久久久久久| 亚洲国产精品久久久久久| 成人免费观看49www在线观看| www.久久撸.com| 欧美一区二区三区图| 欧美激情综合色| 亚洲欧洲第一视频| 国产精品久久久久久婷婷天堂| 国产精品爱久久久久久久| 狠狠色狠狠色综合日日小说| 国产在线高清精品| 97高清免费视频| 欧美日韩国产成人在线| 国产精品日韩欧美| 亚洲精品wwww| 久久精品亚洲精品| 91网在线免费观看| 久久久国产一区| 日韩欧美亚洲成人| 欧美日韩性视频| 亚洲国产欧美一区二区三区同亚洲| 中文字幕日韩精品在线| 国产精品99免视看9| 久久久久久久久久久亚洲| 久久97精品久久久久久久不卡| 欧美高跟鞋交xxxxxhd| 国产成人精品国内自产拍免费看| 久久精品免费电影| 久久精彩免费视频| 亚洲网站在线观看| 国产日韩精品在线观看| www.国产一区| 日韩精品中文字| 欧美成人h版在线观看| 国内成人精品一区| 亚洲欧美精品在线| 日韩高清电影免费观看完整| 精品日本美女福利在线观看| 91色在线观看| 国产精品视频成人| 久久精品色欧美aⅴ一区二区| 国产成人鲁鲁免费视频a| 国产视频福利一区| 欧美大片在线免费观看| 久久99国产综合精品女同| 91精品免费看| 欧美亚洲视频一区二区| 69久久夜色精品国产69乱青草| 国产精品青草久久久久福利99| 亚洲一区国产精品| 55夜色66夜色国产精品视频| 精品久久久久久| 久久精品人人爽| 久久久久久伊人| 亚洲天堂网在线观看| 久久久久久久网站| 2019亚洲男人天堂| 精品亚洲一区二区三区在线播放| 成人自拍性视频| 欧美与欧洲交xxxx免费观看| 中文在线资源观看视频网站免费不卡| 性色av一区二区三区红粉影视| 69视频在线免费观看| 国内精品伊人久久| 亚洲一区二区三区xxx视频|