日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用 JOTM 向Servlet中添加事务

發(fā)布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 JOTM 向Servlet中添加事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
J2EE 除了提供了 servlet 之外,還提供了大量的其它功能。Servlet 開發(fā)者們也許難得使用這些功能,不情愿也沒有時間用一個超出所需的大型 J2EE 服務(wù)器來替換自己的簡單的 servlet。然而,依據(jù)J2EE 的模塊化特征,有可能將負(fù)責(zé)特定 J2EE 功能的小組件整合到 servlet 容器里,以此來增強(qiáng) WEB 應(yīng)用程序。其中之一就是事務(wù)。有關(guān) J2EE 事務(wù)的完整描述,您可以參考Onjava上的其他三篇文章,現(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ù)庫的參照完整性和表中的主鍵唯一性。 獨(dú)立性在事務(wù)沒有提交之前,事務(wù)作用的共享資源的改變在事務(wù)之外是不可見的。獨(dú)立性確保了不同事務(wù)不會同時訪問正在更新的數(shù)據(jù)。 持久性:由事務(wù)提交的改變會永久存在。 JOTM (Java Open Transaction Manager)是由ObjectWeb協(xié)會開發(fā)的功能完整的且資源開放的獨(dú)立的事務(wù)管理器。它提供了 JAVA 應(yīng)用程序的事務(wù)支持,而且與 JTA( JAVA 事務(wù) API)兼容。您可以在JOTM home page了解到更多的詳細(xì)信息。在 TOMCAT(或其它 Servlet 容器)整合了 JOTM 后,JSP 和 servlet 的開發(fā)者們就可以獲得事務(wù)的優(yōu)勢輕而易舉的創(chuàng)建更多健壯的 web 應(yīng)用程序。 為了突出事務(wù)是怎樣增強(qiáng) web 應(yīng)用程序的,舉一個常用的例子, web 瀏覽器與客戶端交互的 ATM 。 ATM 樣例: 情景 此例比較簡單:一個客戶想從 ATM 提款,輸入了他的客戶名稱,john_doe;想提款數(shù),$50。如果他的銀行帳戶上有足夠的錢并且在 ATM 機(jī)上有足夠的現(xiàn)金的話,應(yīng)用程序就能給他相當(dāng)數(shù)目的現(xiàn)金,并從銀行帳戶上提出同樣的數(shù)目。否則,操作中斷,并且除出現(xiàn)錯誤信息之外,其他都不會改變。我們 無需擔(dān)心安全問題,只是在猜想用戶是否正確授權(quán)。 這是一個非常簡單的例子,但是如果不使用事務(wù),用別的方法執(zhí)行起來將會很難??蛻舳瞬僮?將會涉及到兩個不同的資源:ATM 和客戶銀行帳號。它們會自動的在應(yīng)用程序設(shè)計(jì)中產(chǎn)生 ACID 問題。例如:如果在 ATM 上操作成功而在銀行帳戶上卻失敗(也許是因?yàn)榻涣魇?#xff09;,客戶將會取到錢,但是他的帳戶將不會更新。對于銀行來說,這就虧大了。更糟的是,如果銀行帳戶更 新了,但是由于一個錯誤阻止 ATM 傳送錢,客戶得不到現(xiàn)金,但是帳戶上卻提掉了這筆款。 為了防止出現(xiàn)上述事故,在你的應(yīng)用程序里,你能夠 1) 聯(lián)系兩個資源,并告知兩者客戶執(zhí)行的所有當(dāng)前操作,2) 詢問兩者是否能執(zhí)行操作,3)如果兩者都同意,則請求操作。即使這樣,此方法也不能謂之足夠健壯,因?yàn)?#xff0c;如果客戶帳戶上的錢在第二步和第三步的時候被另外 一操作提走,提款可能會失敗,例如,客戶帳戶不能出現(xiàn)逆差。 事務(wù)能使應(yīng)用程序更簡單更健壯的之處就是:在同一事務(wù)的兩個資源上執(zhí)行所有的操作的時候,它將會解決 ACID 的問題(尤其是原子性)。 應(yīng)用程序設(shè)計(jì) 數(shù)據(jù)層:在數(shù)據(jù)層,有兩個不同的數(shù)據(jù)庫,并各自有一張表。為了使例子更接近實(shí)際,我們使用兩個不同的數(shù)據(jù)庫,因?yàn)橛锌赡軓?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 方法中實(shí)現(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ù):如果所有事件完成,提交事務(wù)。否則,回滾事務(wù)。 5. 報(bào)告客戶事務(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)故障,不得不
// 報(bào)告給客戶
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ā)生。/
*/
// 報(bào)告給客戶
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è)計(jì)的部分,但是添加它來簡化資源更新,比如處理客戶帳戶的錢數(shù)。) 圖1 應(yīng)用程序設(shè)計(jì) 配置數(shù)據(jù)庫 關(guān)于數(shù)據(jù)庫,建議使用MySQL 4.0.12和相應(yīng)的 JDBC 驅(qū)動程序(見Resources)。默認(rèn)情況下,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ù)庫和表的腳本在 .s/ 目錄下的 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 |
+----+------+
最后,復(fù)制 $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) 復(fù)制到 $CATALINA_HOME/shared/lib。這樣就完成了。 配置 TOMCAT:需要配置 Tomcat,使之能夠從 JNDI 獲取 UserTransaction 和 DataSource 對象(它們用在 foo.BankAccount 和 bar.ATM)。 首先,告訴 TOMCAT 你所使用的 JNDI 名字,以便在 WEB 應(yīng)用程序中查詢數(shù)據(jù)源。這些步驟由 web.xml 完成,其代碼如下。對于銀行帳戶數(shù)據(jù)源,使用的 JNDI 名字是 java:comp/env/jdbc/bankAccount ,而且只能在 java:comp/env/ 之后給出名字。TOMCAT 通過 JNDI 機(jī)制來解決其余的問題。對于 ATM 數(shù)據(jù)源也同樣于此。 例 4. web.xml
<web-app>
<resource-env-ref>
<de.ion>Bank Account DataSource</de.ion>
<resource-env-ref-name>jdbc/bankAccount</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

<resource-env-ref>
<de.ion>ATM DataSource</de.ion>
<resource-env-ref-name>jdbc/ATM</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
</web-app>
您必須告訴 TOMCAT 怎么樣返回 web.xml內(nèi)的資源,這個過程就由bank.xml文件來完成了。對于銀行帳戶和 ATM 資源,您必須設(shè)置參數(shù),以便 TOMCAT 能將 WEB 應(yīng)用程序與數(shù)據(jù)源正確相連。有關(guān)更多的詳細(xì)信息,請參考 TOMCAT JNDI 數(shù)據(jù)源基礎(chǔ)知識。(參見 Resources) 其中一個參數(shù)需特別關(guān)注:factory.類中設(shè)置這個參數(shù),用于當(dāng) WEB 應(yīng)用程序通過 JNDI 查詢時來創(chuàng)建一個數(shù)據(jù)源。另外一個重要的資源(在 web.xml 中有描述)是 UserTransaction。java:comp/UserTransaction 使用這個資源來區(qū)分事務(wù),它由 JOTM 來執(zhí)行。 例 5 bank.xml
<Context path="/bank" docBase="bank.war" debug="0"
reloadable="true" crossContext="true">

<!-- De.ion of the DataSource "jdbc/bankAccount" -->
<Resource name="jdbc/bankAccount" auth="Container"
type="javax.sql.DataSource" />
<ResourceParams name="jdbc/bankAccount">
<parameter>
<!-- Factory of the DataSource -->
<name>factory</name>
<value>org.objectweb.jndi.DataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost/banktest</value>
</parameter>
<!-- other parameters include:
o username - name of database user
o password - password of the database user
o driverClassName - JDBC Driver name
-->
...
</ResourceParams>

<!-- De.ion of the DataSource "jdbc/ATM" -->
<Resource name="jdbc/ATM" auth="Container"
type="javax.sql.DataSource" />

<!-- same type of parameters than for resource
"jdbc/bankAccount" -->
<ResourceParams name="jdbc/ATM">
...
</ResourceParams>

<!-- De.ion of the resource "UserTransaction -->
<Resource name="UserTransaction" auth="Container"
type="javax.transaction.UserTransaction" />
<ResourceParams name="UserTransaction">
<parameter>
<name>factory</name>
<value>org.objectweb.jotm.UserTransactionFactory</value>
</parameter>
<parameter>
<name>jotm.timeout</name>
<value>60</value>
</parameter>
</ResourceParams>
</Context>
展開 WEB 應(yīng)用程序:一旦你設(shè)置了 JOTM 和TOMCAT ,展開并使用 WEB 應(yīng)用程序就很容易了。首先,下載 bank.tgz 并將之解壓縮, 再將bank.xml 和 bank.war 復(fù)制到 $CATALINA_HOME/webapps 下;然后,啟動 TOMCAT:
> cd $CATALINA_HOME/bin
> ./catalina.sh run
Using CATALINA_BASE:/home/jmesnil/lib/tomcat
Using CATALINA_HOME:/home/jmesnil/lib/tomcat
Using CATALINA_TMPDIR:/home/jmesnil/lib/tomcat/temp
Using JAVA_HOME:/usr/local/java
May 6, 2003 5:56:00 PM org.apache.commons.modeler.Registry loadRegistry
INFO:Loading registry information
May 6, 2003 5:56:00 PM org.apache.commons.modeler.Registry
getRegistry
INFO:Creating new Registry instance
May 6, 2003 5:56:00 PM org.apache.commons.modeler.Registry
getServer
INFO:Creating MBeanServer
May 6, 2003 5:56:07 PM org.apache.coyote.http11.Http11Protocol init
INFO:Initializing Coyote HTTP/1.1 . port 8080
Starting service Tomcat-Standalone
Apache Tomcat/4.1.24-LE-jdk14
您會在日志里面發(fā)現(xiàn) JOTM 還沒有啟動。它是在當(dāng)您第一次訪問 DataSource 時才會啟動的,在那個時候,您將會發(fā)現(xiàn)以下信息:
May 6, 2003 5:56:20 PM org.objectweb.jotm.Jotm <init>
INFO:JOTM started with a local transaction factory that
is not bound.
May 6, 2003 5:56:20 PM org.objectweb.jotm.Jotm <init>
INFO:CAROL initialization
鍵入U(xiǎn)RL[url]http://localhost:8080/bank/[/url]來使用 WEB 應(yīng)用程序。 使用 WEB 應(yīng)用程序 WEB 應(yīng)用程序的首頁包含兩個鏈接: 1. 是 Cash Delivery 頁面,您可以在上面像在 ATM 一樣提款。 圖2 Cash Delivery 頁面 2. 是management console,您在上面可以對 ATM 或自己創(chuàng)建的銀行帳戶進(jìn)行檢測或更新。 圖3 Management Console 操作之前,ATM 有$500,John Doe 銀行帳戶上有 $100 ,Jane Doe 銀行帳戶有 $600 。 如果 John Doe想取 $400 ,交易將會失敗,因?yàn)樵谒膸羯嫌囝~不夠。結(jié)果將是: Client ID:john_doe, value: $400 Cash can not be delivered to you because:not enough money in your account (only $100). 如果 Jane Doe想取 $550 ,交易也會失敗,因?yàn)锳TM上的現(xiàn)金不夠。結(jié)果將是: Client ID:jane_doe, value: $550 Cash can not be delivered to you because:not enough cash available from this ATM (only $500). 如果 John Doe 取 $50 的話,交易將會成功。結(jié)果將是: Client ID:john_doe, value: $50 Please take your cash ($50) Thank you! 總結(jié) 這個簡單的例子證明了 servlet 是怎樣通過使用事務(wù)提供健壯和簡化的,并且確保在任何情況下都正確。Tomcat 和 JOTM 完美的結(jié)合使在 servlet 內(nèi)能輕而易舉的取得事務(wù)的優(yōu)勢。 除上述簡單的例子以外,JOTM還有更多的優(yōu)點(diǎn)。JOTM 提供了以下性能,有助于增強(qiáng) WEB 應(yīng)用程序。 1.完全分布式事務(wù)支持.如果數(shù)據(jù)層、業(yè)務(wù)層、表示層運(yùn)行在不同的 JVM 上,則有可能有一個全程的事務(wù)跨度這些JVM,事務(wù)的內(nèi)容在 RMI/JRMP 和 RMI/IIOP 上傳播。 2.整合 JDBC。使用的 XAPool例子就是一個 XA-兼容的 JDBC 連接池,可以與數(shù)據(jù)庫相互操作。XAPool 類似于 Jakarta DBCP,只是增加了 XA-兼容的特征,如果要結(jié)合 JDBC 使用 JTA 事務(wù)就必須遵從這個特征。 3.整合 JMS。JOTM 可以結(jié)合 JORAM,由ObjectWeb 協(xié)會開發(fā)的“JMS 提供者”提供了事務(wù)的 JMS 消息。你可以得到出現(xiàn)在 servlet中同一事務(wù)的 JMS 消息發(fā)送件和更新的數(shù)據(jù)庫。 4.WEB 服務(wù)事務(wù)。JOTM 提供了BTP(Business Transaction Protocol)、JOTM-BTP接口,它們用于在 WEB 服務(wù)中增加事務(wù)行為。 所有這些功能的樣例和文檔都可以在 JOTM 的檔案和網(wǎng)站上找到。

轉(zhuǎn)載于:https://blog.51cto.com/newhappy/135996

總結(jié)

以上是生活随笔為你收集整理的用 JOTM 向Servlet中添加事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。