王鵬
摘 要:現(xiàn)在電子商務(wù)系統(tǒng)需要盡可能地快速響應(yīng)用戶的請(qǐng)求,而用戶處理電子商務(wù)業(yè)務(wù)的時(shí)候往往必須根據(jù)服務(wù)器中最新的數(shù)據(jù)才能夠做出正確的判斷,這就需要對(duì)電子商務(wù)的數(shù)據(jù)進(jìn)行數(shù)據(jù)陳舊性檢查,以提供給用戶最新的數(shù)據(jù)。本文根據(jù)電子商務(wù)的這一需求,探討了一種解決方案,同時(shí)結(jié)合現(xiàn)今進(jìn)行電子商務(wù)開發(fā)中廣泛應(yīng)用的技術(shù)――EJB中間件技術(shù),針對(duì)開發(fā)中會(huì)遇到的困難,提供了一種開發(fā)思路。
關(guān)鍵詞:數(shù)據(jù)陳舊性;電子商務(wù);版本號(hào);EJB
中圖分類號(hào):TN911 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9599 (2013) 03-0000-02
引言
從應(yīng)用的角度來看,電子商務(wù)系統(tǒng)[1]需要解決越來越多的分布式網(wǎng)絡(luò)應(yīng)用的需求,電子商務(wù)應(yīng)用系統(tǒng)與一般的企業(yè)信息系統(tǒng)的明顯區(qū)別在于電子商務(wù)的客戶群比較多,隨著信息技術(shù)的發(fā)展和網(wǎng)絡(luò)應(yīng)用的普及,客戶群還有大幅度增長(zhǎng)的趨勢(shì)。這就要求在使用J2EE體系進(jìn)行開發(fā)電子商務(wù)應(yīng)用系統(tǒng)的時(shí)候要充分考慮到客戶群的數(shù)量以及系統(tǒng)響應(yīng)客戶群的速度問題。
在電子商務(wù)系統(tǒng)[2]開發(fā)中遇到的一個(gè)普遍問題是在更新服務(wù)器的數(shù)據(jù)之前,這些數(shù)據(jù)是需要用戶手動(dòng)操作的,用戶會(huì)有一個(gè)相對(duì)比較長(zhǎng)的思考時(shí)間(比如客戶需要填寫一個(gè)重要報(bào)表等),系統(tǒng)的處理過程會(huì)被這種情況所打斷。因此,系統(tǒng)不可能等待每個(gè)客戶端進(jìn)行操作以后才接受其他客戶端的申請(qǐng),這樣事務(wù)處理需要等待的時(shí)間過長(zhǎng)。為了提高效率,就需要一種比較好的并發(fā)處理方法,以檢查之前服務(wù)器提供給客戶端進(jìn)行決策的數(shù)據(jù)是不是陳舊的,如果是就進(jìn)行數(shù)據(jù)更新并且通知客戶端。這樣處理的一個(gè)好處是數(shù)據(jù)可能只有一小部分是陳舊的,只需要通知客戶端重新處理這部分?jǐn)?shù)據(jù)即可。本文針對(duì)這個(gè)普遍存在的情況,結(jié)合J2EE的EJB技術(shù)討論了一種解決的方法,并給出了該方法的實(shí)現(xiàn)方案。
串行解決方案的缺陷
不同的分布式應(yīng)用程序經(jīng)常發(fā)生操作同一資源的情況,為了保證每個(gè)事務(wù)讀取的數(shù)據(jù)是最新的,最簡(jiǎn)單的方法就是事務(wù)串行執(zhí)行。如圖一所示,程序A和B同時(shí)需要讀取和更新一個(gè)Accout資源,程序A首先讀取數(shù)據(jù),程序B一直等待程序A讀寫了數(shù)據(jù)后才能夠操作該數(shù)據(jù)。
但是由于采用串行化執(zhí)行,短事務(wù)可能得等待它前面的長(zhǎng)事務(wù)完成,這可能導(dǎo)致難以預(yù)測(cè)的時(shí)延,所以串行化方案的效率低下,系統(tǒng)的可擴(kuò)展性比較差,不利于將來飛速發(fā)展的電子商務(wù)業(yè)務(wù)的需要。
3 版本號(hào)方案
數(shù)據(jù)陳舊性檢查屬于數(shù)據(jù)庫的事務(wù)[3]并發(fā)執(zhí)行的一個(gè)特例。眾所周知,多個(gè)事務(wù)并發(fā)更新數(shù)據(jù)容易引起數(shù)據(jù)一致性問題,一個(gè)事務(wù)在數(shù)據(jù)讀取后和需要存儲(chǔ)之前,也許已經(jīng)被其他事務(wù)更新了,也就是說原先的客戶端所進(jìn)行的操作是基于原來陳舊的數(shù)據(jù)的,需要重新根據(jù)新的數(shù)據(jù)進(jìn)行處理??梢詤⒖紨?shù)據(jù)庫中時(shí)間戳協(xié)議處理事務(wù)并發(fā)的機(jī)制,對(duì)數(shù)據(jù)使用版本號(hào)進(jìn)行處理。版本號(hào)方案就是基于樂觀的并發(fā)執(zhí)行處理的,客戶端都是假設(shè)它所更新的數(shù)據(jù)是基于最新版本號(hào)的數(shù)據(jù)的。
由于考慮到服務(wù)器的時(shí)鐘有可能被回?fù)芑蛘邥r(shí)間日期太小,難以排除兩個(gè)事務(wù)差不多同時(shí)需要更新版本號(hào)的時(shí)候,陳舊性檢查有可能變成無效的,所以使用一種比較簡(jiǎn)單的方法,就是用一個(gè)簡(jiǎn)單的整數(shù)表示版本號(hào),然后遞增版本號(hào)來判斷數(shù)據(jù)是否陳舊。并發(fā)處理的原子性操作由數(shù)據(jù)庫本身完成,服務(wù)器端僅僅從大的方面進(jìn)行判斷數(shù)據(jù)是否陳舊,以方便反饋客戶端即可。具體操作如下:
(1)給任何需要進(jìn)行判斷是否陳舊的數(shù)據(jù)添加版本號(hào),根據(jù)實(shí)際需要,數(shù)據(jù)可以是表的一行,也可以是很多數(shù)據(jù)的集合。
(2)一個(gè)事務(wù)讀取數(shù)據(jù)的同時(shí)讀取它的版本號(hào)。
(3)當(dāng)需要更新數(shù)據(jù)的時(shí)候,同時(shí)返回該數(shù)據(jù)的版本號(hào)。
(4)版本號(hào)檢查算法的偽代碼如下:
4 在EJB中的實(shí)現(xiàn)難點(diǎn)
4.1 如何在EJB中實(shí)現(xiàn)版本號(hào)方案
4.2 如何處理并發(fā)的一致性問題
通過EJB,我們能夠?qū)懗隹蓴U(kuò)展的、健壯的和安全的應(yīng)用程序,而不用自己構(gòu)造復(fù)雜的分布式組件框架。而EJB容器的實(shí)例調(diào)度池的優(yōu)點(diǎn)是實(shí)體Bean要比實(shí)際連接它的客戶數(shù)目少得多,當(dāng)一個(gè)用戶在思考的時(shí)候,用戶可以使用Bean實(shí)例為其他用戶服務(wù),這樣就節(jié)省了以前的系統(tǒng)資源。同時(shí),由于電子商務(wù)的需要處理的數(shù)據(jù)量比較大,所以不可能只使用一臺(tái)服務(wù)器提供服務(wù),那么現(xiàn)在許多J2EE服務(wù)器軟件(例如Weblogic8.0)提供了多臺(tái)服務(wù)器協(xié)作運(yùn)行的服務(wù)機(jī)制,對(duì)客戶端看來,這么多服務(wù)器共同工作時(shí)就好像只有一臺(tái)服務(wù)器在工作。這就提高了EJB中實(shí)行版本號(hào)方案時(shí)保持?jǐn)?shù)據(jù)的一致性的難度。這是因?yàn)槊恳慌_(tái)服務(wù)器都有一個(gè)Java的虛擬機(jī)JVM,EJB容器有能力將一個(gè)EJB實(shí)例跨過幾個(gè)JVM調(diào)用,因此一種罕見的情況有可能發(fā)生,那就是在不同服務(wù)器上的具有相同版本號(hào)的實(shí)體Bean同時(shí)被放在內(nèi)存中,服務(wù)器端檢查版本號(hào)的時(shí)候,調(diào)用實(shí)體Bean的checkVersion()函數(shù)的version != currentVersion語句的時(shí)候,兩個(gè)事務(wù)會(huì)同時(shí)檢測(cè)到版本號(hào)是相等的,那么這兩個(gè)實(shí)體Bean就有可能同時(shí)要求更新數(shù)據(jù)(setVersion(++currentVersion)語句來實(shí)現(xiàn))。此時(shí)不好判斷哪個(gè)實(shí)體Bean的數(shù)據(jù)是陳舊的。唯一的方法就是由應(yīng)用服務(wù)器或者數(shù)據(jù)庫的事務(wù)隔離機(jī)制來處理。不同的數(shù)據(jù)庫和應(yīng)用服務(wù)器有不同的并發(fā)處理方法,一般需要針對(duì)具體數(shù)據(jù)庫來編寫相應(yīng)的代碼。
4.3 如何處理重復(fù)檢查的問題
由于連接服務(wù)器的客戶端數(shù)量比較多,因此有可能發(fā)生一個(gè)客戶端在服務(wù)器數(shù)據(jù)處理比較頻繁的時(shí)候,重復(fù)檢查數(shù)據(jù)是否為最新的,并一直重復(fù)向服務(wù)器請(qǐng)求新版本的數(shù)據(jù),這樣就加大了服務(wù)器的工作量。因此可以在EJB的一個(gè)會(huì)話Bean中根據(jù)部署文件的設(shè)置來判斷允許重復(fù)嘗試的次數(shù),同時(shí)可以捕獲判斷版本號(hào)的時(shí)候拋出的異常,這就方便了客戶端做出相應(yīng)的處理。
5 結(jié)束語
今天,對(duì)IT 行業(yè)的挑戰(zhàn)就是怎樣在企業(yè)的上高效地開發(fā)和發(fā)布分布式應(yīng)用系統(tǒng)。為了減少開發(fā)成本和提高程序設(shè)計(jì)和開發(fā)速度,J2EE平臺(tái)提供了一套基于組件的設(shè)計(jì)開發(fā)以及集成和發(fā)布應(yīng)用程序的方法。但是企業(yè)的電子商務(wù)的需求千變?nèi)f化,因此需要根據(jù)實(shí)際情況,對(duì)分布式系統(tǒng)進(jìn)行針對(duì)性的開發(fā),不斷的提供好的開發(fā)方案,這樣才能促使企業(yè)的電子商務(wù)及其他應(yīng)用系統(tǒng)得到了新的發(fā)展,同時(shí)使企業(yè)具有強(qiáng)大的競(jìng)爭(zhēng)優(yōu)勢(shì)。
參考文獻(xiàn):
[1]Choist,Whinston AB. The future of E-Commerce: integrate and customize. IEEE computer 1999,32(1):133~138.
[2]蘭宜生.電子商務(wù)基本教程[M].清華大學(xué)出版杜,2004.
[3]Abraham Silberschatz ,Henry E Korth. Database System concepts:third Edition[M].
[4]Kyle Brown , Lee Cook. Whats it going to take to get you to go withEJBcomponents.http ://PPwww.900.ibm.comPdeveloper2WorksPcnPwebPibm - ejbPindex- eng. Shtml.
[5]Floyd Marinescu. EJB Design Patterns[M].
[6]http://java.sun.com/products/ejb/white2paper.html[EB/OL].
[7]http://java.sun.com/j2ee/tutorial[EB/OL].
[8]Sun Microsystems Inc. Java 2 Platform Enterprise Edition Specification (v1.3)[Z].USA :Sun Microsystems Inc,2001.
計(jì)算機(jī)光盤軟件與應(yīng)用2013年3期