第14章 EJB高級(jí)——事務(wù)處理_第1頁(yè)
第14章 EJB高級(jí)——事務(wù)處理_第2頁(yè)
第14章 EJB高級(jí)——事務(wù)處理_第3頁(yè)
第14章 EJB高級(jí)——事務(wù)處理_第4頁(yè)
第14章 EJB高級(jí)——事務(wù)處理_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、EJB中的事務(wù)處理內(nèi)容提要nContainer Managed Transaction (CMT)nBean Managed Transaction (BMT)EJB支持的事務(wù)種類nEJB容器支持兩種類型的事務(wù):n容器管理的事務(wù)(CMT-Container Managed Transaction)nBean自己管理事務(wù)(BMT-Bean Managed Transaction)n兩種類型的事務(wù)不能在同一個(gè)EJB模塊中混用一、CMTnContainer Managed Transactionn程序員在Bean的源程序中沒有事務(wù)邊界控制的代碼(如事務(wù)開始、回滾、提交等)n在部署描述符中指定事務(wù)屬性

2、,由容器控制事務(wù)的邊界。n容器維護(hù)的事務(wù)是方法級(jí)的n即默認(rèn)將一個(gè)方法當(dāng)作一個(gè)事務(wù)執(zhí)行n當(dāng)方法執(zhí)行的過程中,發(fā)生系統(tǒng)級(jí)異常,容器會(huì)自動(dòng)將事務(wù)回滾,即將方法中所執(zhí)行的數(shù)據(jù)庫(kù)操作結(jié)果取消。1、方法的事務(wù)屬性n一個(gè)商業(yè)方法的事務(wù)屬性在部署描述符中用標(biāo)記加以規(guī)定,該標(biāo)記可以具有以下屬性值:nNEVERn具有這種屬性的方法不支持事務(wù)處理nSUPPROTSn是默認(rèn)值,表示該方法支持事務(wù),當(dāng)其他具有事務(wù)支持的方法調(diào)用該方法時(shí),當(dāng)前方法中執(zhí)行的數(shù)據(jù)庫(kù)操作代碼將成為其他方法中事務(wù)的一部分nREQUIREDn明確聲明該方法要求容器對(duì)其進(jìn)行事務(wù)處理支持,當(dāng)其他具有事務(wù)支持的方法調(diào)用該方法時(shí),這個(gè)方法中執(zhí)行的數(shù)據(jù)庫(kù)操作

3、代碼也將成為事務(wù)中的一部分nREQUIRESNEWn明確要求事務(wù)支持,并且該方法執(zhí)行時(shí)會(huì)產(chǎn)生一個(gè)新的事務(wù)nMANDATORYn該方法必須位于一個(gè)事務(wù)處理環(huán)境中,否則將拋出一個(gè)需要進(jìn)行事務(wù)支持的異常2、異常處理和事務(wù)的回滾nEJB中的異常種類n系統(tǒng)級(jí)異常n系統(tǒng)級(jí)異常即運(yùn)行時(shí)刻異常,這類異常的父類是RuntimeException,不需要在源代碼中用trycatch進(jìn)行顯示處理n應(yīng)用程序異常n應(yīng)用程序異常即檢查異常,這類異常的父類是Excepetion,需要在源代碼中用trycatch進(jìn)行顯示處理n如果在一個(gè)方法中要求事務(wù)處理,而在方法的執(zhí)行過程中出現(xiàn)了異常,那么容器將按如下方式處理事務(wù):n如果異

4、常屬于系統(tǒng)級(jí)異常,則容器將停止執(zhí)行當(dāng)前的方法,同時(shí)銷毀當(dāng)前運(yùn)行的會(huì)話Bean的實(shí)例,回滾事務(wù)n如果異常屬于應(yīng)用程序異常,則容器不會(huì)銷毀當(dāng)前會(huì)話Bean的實(shí)例,事務(wù)也不會(huì)自動(dòng)回滾,而是暫時(shí)掛起,等待客戶端的處理3、CMT示例CMT示例n本示例創(chuàng)建一個(gè)名為Bank的EJB模塊,用于銀行的轉(zhuǎn)賬和查帳功能,其中轉(zhuǎn)賬和查帳都在數(shù)據(jù)庫(kù)中進(jìn)行nBanker是一個(gè)無狀態(tài)會(huì)話Bean,主要含有以下商業(yè)方法:n商業(yè)方法trans將orgName賬號(hào)中的指定金額轉(zhuǎn)入dstName賬號(hào):n聲明形式: public void trans(String orgName,dstName int amount)n功能: 如果

5、將orgName賬號(hào)中的金額在數(shù)據(jù)庫(kù)中減少后,存入dstName賬號(hào)時(shí)出現(xiàn)了問題,則該方法對(duì)應(yīng)的數(shù)據(jù)庫(kù)操作會(huì)自動(dòng)取消,這是由容器管理的事務(wù)完成的。n商業(yè)方法getBalance檢測(cè)指定賬號(hào)的存款余額n聲明形式: public int getBalance(String accountName) 創(chuàng)建TransDemo項(xiàng)目,加入Bank模塊加入Banker會(huì)話Bean加入商業(yè)方法將Banker加入到模塊Bank中修改BankerBean.java文件引入必要的包首先除去一些無用的注釋,加入如圖所示的注釋: ejb.resource-ref生成訪問數(shù)據(jù)源的部署描述符,本示例使用JBoss自帶的Hy

6、personic SQL數(shù)據(jù)庫(kù),它的JNDI名稱為DefaultDS,規(guī)定這個(gè)數(shù)據(jù)源JNDI名的文件處于JBoss的啟動(dòng)配置文件夾中deploy目錄中,名為hsqldb-ds.xml。 注意注意res-ref-name屬性值的格式為jdbc/數(shù)據(jù)源名稱數(shù)據(jù)源名稱加入數(shù)據(jù)源屬性ds的定義加入ejbCreate方法和相關(guān)注釋ejb.create-method注釋在Home和LocalHome接口中生成create方法聲明注意查找數(shù)據(jù)源的格式:java:comp/env這個(gè)前綴是在JNDI樹中查找任何資源都需要加入的前綴獲取到數(shù)據(jù)庫(kù)的連接,創(chuàng)建所需要的賬戶表account,創(chuàng)建后,加入兩條記錄,一個(gè)

7、賬戶名為WANG,存入200元;另一個(gè)賬戶為L(zhǎng)I,也存入200元修改getBalance商業(yè)方法erface-method可以使得本地和遠(yuǎn)程兩個(gè)接口中都有g(shù)etBalance商業(yè)方法的定義利用PreparedStatement在賬戶表account中查詢給定用戶的賬號(hào)余額如果rs.next()返回false,則證明指定的賬號(hào)在account表中不存在,所以拋出RuntimeException異常類的實(shí)例,并利用其構(gòu)造方法說明發(fā)生異常的原因是由于指定的賬號(hào)不存在修改trans商業(yè)方法(處理轉(zhuǎn)出賬號(hào))數(shù)據(jù)庫(kù)操作:首先利用數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)連接,操作賬戶記錄,從轉(zhuǎn)出賬戶orgAccoun

8、t中扣除所取金額ejb.transaction type=“required”在部署描述符中生成相關(guān)注釋,表明這個(gè)方法需要容器處理事務(wù)修改trans商業(yè)方法(處理轉(zhuǎn)入賬號(hào))將指定金額存入轉(zhuǎn)入賬號(hào)時(shí),首先檢測(cè)轉(zhuǎn)入賬號(hào)的原有金額。getBalance方法在給定賬號(hào)不存時(shí)拋出異常代表查找失敗在轉(zhuǎn)賬結(jié)束之后,輸出在執(zhí)行trans方法時(shí)的轉(zhuǎn)出和轉(zhuǎn)入賬號(hào)的余額,用來對(duì)比在結(jié)束trans方法的執(zhí)行,事務(wù)回滾后的轉(zhuǎn)出和轉(zhuǎn)入賬號(hào)的余額trans方法至此結(jié)束trans商業(yè)方法中的事務(wù)執(zhí)行過程目標(biāo): 由容器維護(hù)trans方法的事務(wù)。如果前半段的轉(zhuǎn)出數(shù)據(jù)庫(kù)操作成功,而后面的轉(zhuǎn)入數(shù)據(jù)庫(kù)操作失敗,則容器的自動(dòng)事務(wù)回滾應(yīng)該

9、恢復(fù)前面所作的數(shù)據(jù)庫(kù)修改。 代碼中不處理轉(zhuǎn)出數(shù)據(jù)庫(kù)操作成功而轉(zhuǎn)入數(shù)據(jù)庫(kù)操作失敗的情況產(chǎn)生EJB Files產(chǎn)生EJB Files之后的部署描述中的事務(wù)屬性設(shè)置事務(wù)管理特性: 指定Container管理事務(wù)這段方法的事務(wù)描述由trans方法之前的XDoclet注釋ejb.transaction type=“required”自動(dòng)產(chǎn)生,描述了trans方法的參數(shù)構(gòu)成和事務(wù)要求,該事務(wù)由Container進(jìn)行管理部署B(yǎng)ank模塊為了觀察方便,請(qǐng)點(diǎn)擊控制臺(tái)窗口的“清除”按鈕,將JBoss控制臺(tái)中顯示的部署消息清空創(chuàng)建測(cè)試客戶端修改TestBanker.java,引入必要的包調(diào)用遠(yuǎn)程EJB組件所需的包T

10、estBanker將用圖形用戶界面處理用戶的查詢,所以引入java.awt包和事件處理包java.awt.event修改TestBanker的testBean方法用于連接遠(yuǎn)程EJB對(duì)象的myBean在testBean方法中定義了一個(gè)內(nèi)部類,用于顯示一個(gè)如右圖所示的用戶界面,便于查詢事件處理代碼(得到Banker的正確引用)由于在查詢和轉(zhuǎn)帳的操作中都要調(diào)用getBalance方法,這個(gè)方法拋出的是系統(tǒng)級(jí)異常,所以會(huì)導(dǎo)致容器銷毀當(dāng)前的會(huì)話Bean,因此,在每次點(diǎn)擊按鈕時(shí)都要調(diào)用Home接口的create方法得到正確的會(huì)話Bean引用事件處理代碼(轉(zhuǎn)入按鈕部分)如果用戶點(diǎn)擊的是“轉(zhuǎn)入!”按鈕,則通過

11、遠(yuǎn)程對(duì)象banker,調(diào)用trans商業(yè)方法進(jìn)行轉(zhuǎn)賬處理事件處理代碼(查詢余額部分)當(dāng)用戶轉(zhuǎn)賬之后,或用戶按了“查詢余額”按鈕,調(diào)用getBalance商業(yè)方法查詢用戶賬號(hào)的余額查詢結(jié)果顯示區(qū)事件處理代碼(異常處理部分)如果沒有發(fā)生異常,則在操作結(jié)果顯示區(qū)顯示操作成功信息操作結(jié)果顯示區(qū)發(fā)生異常時(shí),通過檢索異常類實(shí)例,得到確切的異常信息ATM構(gòu)造方法代碼窗口關(guān)閉和點(diǎn)擊按鈕的事件監(jiān)聽的添加生成界面代碼構(gòu)造ATM類的實(shí)例,顯示界面,testBean代碼到此結(jié)束。運(yùn)行TestBanker.java文件TestBanker的運(yùn)行初始化界面客戶端程序初始運(yùn)行界面如圖,輸入賬號(hào)WANG和LI之后(注意全部是

12、大寫),點(diǎn)擊“查詢余額”按鈕,界面顯示W(wǎng)ANG和LI的賬號(hào)余額正常轉(zhuǎn)賬的客戶端和服務(wù)端信息JBoss在控制臺(tái)中顯示了轉(zhuǎn)賬過程中的WANG和LI賬號(hào)變化的詳細(xì)信息,可以看出,賬號(hào)的變化信息和客戶端的顯示信息是一致的如圖,輸入轉(zhuǎn)賬金額后10后,賬號(hào)WANG和LI的賬戶余額發(fā)生了相應(yīng)的變化,程序提示操作成功,同時(shí)JBoss控制臺(tái)顯示相應(yīng)的轉(zhuǎn)賬的詳細(xì)信息異常轉(zhuǎn)賬時(shí)的客戶端和服務(wù)器信息將轉(zhuǎn)入賬號(hào)改為ZHANG,這個(gè)用戶在數(shù)據(jù)庫(kù)中并不存在,所以無法將WANG的金額轉(zhuǎn)入ZHANG的賬號(hào),程序底部提示轉(zhuǎn)賬失敗。同時(shí)JBoss則在控制臺(tái)中顯示一些異常信息轉(zhuǎn)賬失敗后,重新輸入轉(zhuǎn)入賬號(hào)LI。按“查詢余額“按鈕,可以

13、看到WANG和LI的賬戶余額都沒有改變,證明事務(wù)回滾成功異常轉(zhuǎn)賬時(shí)服務(wù)端顯示的交易信息向上滾動(dòng)向上滾動(dòng)JBoss的控制臺(tái)窗口,可以看到服務(wù)器控制臺(tái)打印出的這次交易失敗過程:的控制臺(tái)窗口,可以看到服務(wù)器控制臺(tái)打印出的這次交易失敗過程: 由于轉(zhuǎn)入賬號(hào)不存在,WANG的賬戶轉(zhuǎn)出10后,金額由160減少到了150。從輸出信息可以看出,在本次交易中的最后,WANG的賬號(hào)并沒有因交易失敗恢復(fù)原有的數(shù)值,而是保留了轉(zhuǎn)出后的數(shù)值的數(shù)值150。但從客戶端程序中查到WANG的賬戶資金卻依舊是160。WANG賬戶金額沒有恢復(fù)的原因:賬戶金額沒有恢復(fù)的原因: 控制臺(tái)打印的信息是在商業(yè)方法trans中打印出來的,此時(shí)事

14、務(wù)還未回滾,一旦trans調(diào)用結(jié)束,EJB容器就會(huì)自動(dòng)回滾事務(wù),恢復(fù)WANG的賬戶金額。因此,當(dāng)轉(zhuǎn)賬失敗后,trans方法執(zhí)行結(jié)束,表中賬戶WANG的賬戶金額就會(huì)恢復(fù)到原有的160。二、BMT1、BMTnBean Managed Transactionn程序員在Bean的源程序中控制事務(wù)邊界控制(如事務(wù)開始、回滾、提交等)n在部署描述符中指定由Bean控制事務(wù)的邊界。2、BMT與會(huì)話BeannBMT只能應(yīng)用于會(huì)話Bean,而不能應(yīng)用在實(shí)體Bean當(dāng)中n無狀態(tài)會(huì)話Bean中的事務(wù)n無狀態(tài)會(huì)話Bean由于不保存客戶端的調(diào)用狀態(tài),所以BMT只能界定在一次商業(yè)方法調(diào)用,也就是只能事務(wù)的范圍僅能處于一個(gè)

15、商業(yè)方法中n有狀態(tài)會(huì)話Beann有狀態(tài)會(huì)話Bean中的BMT可以跨越方法的邊界,在多個(gè)方法中管理同一個(gè)事務(wù)3、BMT示例程序BMT示例程序n和CMT例子的功能相同,Banker提供銀行賬戶的轉(zhuǎn)賬和查詢nBanker的trans商業(yè)方法中的事務(wù)不再由容器控制,而是自行管理。n本示例的主體代碼與原CMT示例基本相同,所以可以在CMT示例基礎(chǔ)上進(jìn)行修改完成修改BeankerBean.java,引入需要的類因?yàn)閎ean自己控制事務(wù),所以需要在XDoclet的ejb.bean注釋中加入transaction-type項(xiàng),指定其值為“Bean”,這樣在生成的部署描述符文件ejb-jar.xml中會(huì)指明事務(wù)

16、由Bean自己控制用于事務(wù)處理的UserTransaction類修改BeankerBean.java,加入相應(yīng)的方法加入context成員,用于保存容器傳遞的SessionContext引用。在bean自己控制事務(wù)時(shí),需要利用該對(duì)象獲得用戶事務(wù)的引用。注意:注意:不要省略setSessionContext方法上方的JavaDoc注釋,它被子類中的setSessionContext方法用于對(duì)本類當(dāng)前方法進(jìn)行調(diào)用。如果沒有該語(yǔ)句,則當(dāng)前這個(gè)setSessionContext方法就不會(huì)被容器所調(diào)用修改trans方法,加入顯式事務(wù)控制控制事務(wù)開始由于是由Bean自身控制事務(wù),所以不再需要加入ejb.t

17、ranstraction type=“required”注釋修改trans方法,加入事務(wù)提交語(yǔ)句正常完成后提交事務(wù)修改trans方法,發(fā)生異常時(shí)回滾事務(wù)發(fā)生異常,將事務(wù)回滾trans中的事務(wù)處理整體示意正常提交異?;貪L事務(wù)開始生成EJB FilesEJB-JAR.XML文件中的事務(wù)聲明標(biāo)志中的值為Bean,該標(biāo)志由類級(jí)注釋ejb.bean transaction-type = “Bean”生成部署B(yǎng)ank模塊為了觀察方便,請(qǐng)點(diǎn)擊控制臺(tái)窗口的“清除”按鈕,將JBoss控制臺(tái)中顯示的部署消息清空再次運(yùn)行客戶端如圖,輸入賬號(hào)WANG和LI之后(注意全部是大寫),點(diǎn)擊“查詢余額”按鈕,界面顯示W(wǎng)ANG

18、和LI的賬號(hào)余額如圖,輸入轉(zhuǎn)賬金額后10后,賬號(hào)WANG和LI的賬戶余額發(fā)生了相應(yīng)的變化,程序提示操作成功服務(wù)器端控制臺(tái)顯示的具體轉(zhuǎn)賬信息JBoss的運(yùn)行控制臺(tái)中顯示了轉(zhuǎn)賬過程的具體細(xì)節(jié)信息,對(duì)比轉(zhuǎn)賬前和轉(zhuǎn)賬后的客戶端界面,可以看出賬戶WANG和賬戶LI資金金額的變化情況轉(zhuǎn)賬前轉(zhuǎn)賬后轉(zhuǎn)賬失敗界面將轉(zhuǎn)入賬號(hào)改為ZHANG,按“轉(zhuǎn)入!”按鈕,程序提示操作失敗,同時(shí)JBoss的控制臺(tái)中顯示了異常信息點(diǎn)擊滾動(dòng)JBoss的控制臺(tái)窗口,可以看到更為詳細(xì)的轉(zhuǎn)賬失敗信息JBoss控制臺(tái)中打印的轉(zhuǎn)賬失敗的詳細(xì)信息可以看出,本次轉(zhuǎn)賬過程中,賬號(hào)WANG中的金額在轉(zhuǎn)賬前為150,取出10元后,數(shù)據(jù)庫(kù)中的數(shù)據(jù)為140,但由于轉(zhuǎn)入賬號(hào)ZHANG并不存在,所以事務(wù)回滾。由于是Bean自身控制事務(wù),所以WANG的賬戶金額直接恢復(fù)成了150,這和CMT的示例有所不同。在CMT示例中,WANG的賬號(hào)資金并沒有直接恢復(fù)原有金額,而是在trans方法執(zhí)行結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論