<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-4  評(píng)論-1  文章-0  trackbacks-0

    本文將簡(jiǎn)單談?wù)勎覍?duì) EJB 3.0 的兩種 Persistence Context 和 Seam-managed Persistence Context 的不同點(diǎn)的理解、所要解決的問(wèn)題和我自己所疑惑的問(wèn)題。

    EJB 3.0 (JPA) 的 Persistence Context

        大家在使用 EJB 3.0 的時(shí)候會(huì)注意到 EJB 3.0 中的容器管理 Persistence Context 有兩種類(lèi)型,一種是 Transaction,另一種是 Extended。這是一個(gè)較 Hibernate 的 Session 所沒(méi)有的概念,Session 沒(méi)有兩種不同的類(lèi)型,而且最重要的是 Session 不是容器管理的,這里的容器指的是 App Server 容器。這里暫時(shí)不談?wù)?Persistence Context 與 Session 之間的異同,主要談?wù)剝煞N Persistence Context 之間的不同。學(xué)過(guò) ORM 的同學(xué)都知道,當(dāng) Persistence Context 是打開(kāi)狀態(tài)的時(shí)候,Model 就處于被管理的狀態(tài)中;當(dāng) Persistence Context 關(guān)閉之后,Model 就處于了 Detached 狀態(tài)。

        上面這些特性對(duì)于 Transaction 或 Extended 的 Persistence Context 都是一樣的,不同的地方在于 Persistence Context 何時(shí)被打開(kāi)關(guān)閉。由于絕大多數(shù)情況下 Persistence Context 是被容器管理的(如果你不嫌累也可以自己控制 Persistence Context),所以在 EJB 3.0 應(yīng)用中看不到打開(kāi)或關(guān)閉 Persistence Context 的代碼(Spring + Hibernate 的應(yīng)用也同樣如此,Hibernate Session 的管理工作可以交給 Spring 來(lái)做)。


        其實(shí),Transaction 和 Extended Persistence Context 的不同之處也就在于容器何時(shí)打開(kāi)或關(guān)閉 Persistence Context。Transaction 類(lèi)型的 Persistence Context 的打開(kāi)和關(guān)閉是和事務(wù)的打開(kāi)和關(guān)閉是同步的。也就是說(shuō)在一個(gè)事務(wù)開(kāi)始之后,Persistence Context 才會(huì)開(kāi)始;在事務(wù)關(guān)閉的時(shí)候,相應(yīng)的 Persistence Context 也會(huì)被關(guān)閉。

       Extended 類(lèi)型的 Persistence Context 的打開(kāi)和關(guān)閉是和 Stateful Session Bean 的生命周期同步的,是跨越事務(wù)的。也就是說(shuō),從 SFSB 的初始化開(kāi)始,直到銷(xiāo)毀,Persistence Context 都是存在的。你可以在事務(wù)之外執(zhí)行寫(xiě)操作,但是這是并不會(huì)執(zhí)行真正的數(shù)據(jù)庫(kù)操作,寫(xiě)操作只是放入了隊(duì)列,直到下一個(gè)事務(wù),寫(xiě)操作才會(huì)真正地被執(zhí)行。兩者的 不同簡(jiǎn)單說(shuō)來(lái)就是 Extended Persistence Context 存在的時(shí)間更長(zhǎng)。那為什么要有兩種不同的 Persistence Context 呢?

        當(dāng)一個(gè) Web 請(qǐng)求到來(lái)時(shí),服務(wù)器會(huì)打開(kāi)一個(gè)線程,這個(gè)線程可能會(huì)調(diào)用一個(gè)事務(wù)方法,這是一個(gè)事務(wù)便開(kāi)始了,當(dāng)這個(gè)請(qǐng)求結(jié)束時(shí),線程關(guān)閉,事務(wù)也隨之結(jié)束。由于 Transaction 類(lèi)型的 Persistence Context 的生存周期是在事務(wù)范圍之內(nèi)的,所以一個(gè) Web 請(qǐng)求的結(jié)束也意味著相應(yīng)的 Persistence Context 的關(guān)閉。由于多數(shù) Web 應(yīng)用在一次 Web 請(qǐng)求內(nèi)即可完成一個(gè)獨(dú)立的操作,所以大部分情況下 Transaction 的 Persistence Context 是適用的。但是對(duì)于一些復(fù)雜的應(yīng)用,一次操作需要跨越多次請(qǐng)求。這種情況下,如果依舊使用 Transcation 的 Persistence Context,由于每次請(qǐng)求結(jié)束后,相應(yīng)的 Persistence Context 都被關(guān)閉,相應(yīng)的 Model 也就變?yōu)?Detached 狀態(tài)。如果接下來(lái)的請(qǐng)求仍然需要這些已經(jīng)變?yōu)?Detached 狀態(tài)的 Model 就需要重新 load,使用 merge() 方法來(lái)持久化。稍有不適就會(huì)產(chǎn)生 LazyInitializationException 和 NonUniqueObjectException。同時(shí),這也提高了操作的復(fù)雜程度。

        如果使用 Extended Persistence Context 就能解決這些問(wèn)題。由于 Extended Persistence Context 的生命周期是與 SFSB 的生命周期同步的,所以只要多次請(qǐng)求調(diào)用的都是同一個(gè) SFSB 中的方法,有多少次的請(qǐng)求,Persistence Context 總是同一個(gè),其中的 Model 也始終是被管理的。很好地解決了 Persistence Context 在線程之間傳遞的問(wèn)題,也不會(huì)有 LazyInitializationException 和 NonUniqueObjectException 問(wèn)題的發(fā)生。

    Seam-managed Persistence Context

        EJB 3.0 容器管理之下的 Persistence Context 很不錯(cuò),能解決很多問(wèn)題,但是還是有些問(wèn)題無(wú)法解決。Seam 很強(qiáng)大,如果有些問(wèn)題 EJB 容器解決不了了,沒(méi)關(guān)系,把 Persistence Context 交由 Seam 來(lái)管理就 OK 了。那 Seam 都能解決哪些 EJB 不能解決的問(wèn)題呢?先考慮下面兩個(gè)問(wèn)題:

    1. Extended Persistence Context 雖然可以跨越多個(gè)事務(wù),但是每個(gè)事務(wù)照舊調(diào)教不誤,這對(duì)于想在想讓整個(gè)操作作為一次事務(wù)的話(huà),該如何去做
    2. 如果一個(gè)業(yè)務(wù)的一組請(qǐng)求只是調(diào)用同一個(gè) SFSB 的話(huà),那么 EJB 的 Extended Persistence Context 可以在線程之間傳遞,使 SFSB 的整個(gè)生命周期都使用同一個(gè) Persistence Context。但如果業(yè)務(wù)需要調(diào)用不同的 SFSB 的話(huà),如何在 SFSB 之間傳遞。
        對(duì)于第一個(gè)問(wèn)題,由于 Seam 的 JPA 實(shí)現(xiàn)提供者是 Hibernate,而且 Hibernate 提供了一個(gè)擴(kuò)展的 FlushModeType - "Manual"。通過(guò)使用這個(gè) FlushModeType,我們可以手工控制何時(shí)執(zhí)行 flush() 操作。在 Seam 的文檔中有關(guān)于這部分的介紹 《Seam-managed persistence contexts and atomic conversations 》。文檔中使用了一段簡(jiǎn)單的代碼展示 Seam 如何實(shí)現(xiàn)所謂的 "atomic conversations"(關(guān)于代碼的內(nèi)容我就不介紹了,大家通過(guò)我提供的鏈接來(lái)瀏覽 Seam 的文檔)。通過(guò)這種方式,事務(wù)貌似是跨越了整個(gè)事務(wù),但我認(rèn)為 SFSB 中除了調(diào)用 flush() 的方法以外的其它方法不是事務(wù)的。其實(shí)也沒(méi)有必要,因?yàn)檫@些方法并沒(méi)有執(zhí)行數(shù)據(jù)庫(kù)操作,所以沒(méi)有必要使用事務(wù)。當(dāng)然,如果是樂(lè)觀事物的話(huà),使用了對(duì)性能影 響也不大(這只是我的一點(diǎn)淺薄的理解,歡迎指出錯(cuò)誤)。只有最后的調(diào)用了 flush() 的方法有事務(wù)的必要。

        這就引發(fā)了一個(gè)令我不解的問(wèn)題。請(qǐng)先看這篇文章《Extended Persistence Context in Stateful Session Beans 》。在這篇文章介紹了如何只使用 EJB 3.0 去解決“問(wèn)題1”。文中的 SFSB 的默認(rèn)事務(wù)屬性是 "NOT_SUPPORTED",也就是說(shuō)這個(gè) SFSB 中的方法默認(rèn)不是事務(wù)的。只有最后的調(diào)用 flush() 的方法使用了 "REQUIRED" 的事務(wù)屬性去覆蓋默認(rèn)設(shè)置。也就是最后的方法是事務(wù)的,其它的不是。這和 Seam 所做的有區(qū)別嗎?感覺(jué)沒(méi)有區(qū)別。但我認(rèn)為像 Gavin King 這樣的大牛絕不會(huì)做無(wú)用功的,那問(wèn)題就是 Seam 實(shí)現(xiàn) "atomic conversations" 的內(nèi)部細(xì)節(jié)到底是什么呢?歡迎大家回答這個(gè)問(wèn)題。

        對(duì)于第二個(gè)問(wèn)題,可以通過(guò)使用 Seam-Managed Persistence Context 來(lái)解決。Seam-manged Persistence Context 需要在 components.xml 文件中進(jìn)行配置,并使用 @In 注入到 Seam 的組件中。由于 Seam 是一個(gè)比較新的框架技術(shù),所以關(guān)于 Seam 是如何使 Persistence Context 在組件中傳遞并沒(méi)有詳細(xì)的介紹。應(yīng)該只是聲明,然后透明地使用即可。在一個(gè) jBPM 流程中被使用到的 Seam 組件,其中的 Persistence Context 應(yīng)該是可以很容易地被傳遞。(本不應(yīng)該使用不確定的和模糊的詞語(yǔ),但無(wú)奈現(xiàn)在關(guān)于 Seam 的文章資料還是有限,所以我也沒(méi)有找到關(guān)于 Persistence Context 在組件之間調(diào)用的例子)

    結(jié)束語(yǔ):這篇文章解釋的問(wèn)題不多,不過(guò)都是我自己的理解??赡苡绣e(cuò)誤 的地方,歡迎大家指出。同時(shí),又有一些新問(wèn)題產(chǎn)生了,應(yīng)該可以通過(guò)閱讀 Seam 提供的例子和源代碼得到解釋。但 Seam 的例子只看過(guò)三個(gè),更多的還沒(méi)有看??催^(guò)的 Seam 的源代碼更可以忽略不計(jì)。繼續(xù)努力吧!!
    posted on 2008-06-14 21:59 阿里 閱讀(1476) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 中文字幕亚洲不卡在线亚瑟| 免费人成网站在线高清| 国产亚洲精品福利在线无卡一| 亚洲AV无码一区二区大桥未久| 好先生在线观看免费播放| 亚洲乱码一区av春药高潮| 成年美女黄网站18禁免费| 91在线亚洲综合在线| 国产色爽女小说免费看| 亚洲s码欧洲m码吹潮| 国产一级淫片免费播放| 免费人成在线视频| 国产亚洲国产bv网站在线| 国产无人区码卡二卡三卡免费 | 亚洲一区二区三区偷拍女厕 | 无码乱肉视频免费大全合集| 亚洲人成综合在线播放| 24小时日本在线www免费的| 亚洲精品又粗又大又爽A片| 免费大学生国产在线观看p| 国产精品高清免费网站 | 波多野结衣视频在线免费观看| 色妞www精品视频免费看| 亚洲熟妇无码八AV在线播放| 免费A级毛片无码视频| 亚洲人成在线中文字幕| 青草草在线视频永久免费| 一级毛片视频免费观看| 亚洲国产精品久久久久婷婷软件| 手机看黄av免费网址| 免费国产va视频永久在线观看| 国产亚洲精品自在久久| 国产啪精品视频网免费| 曰批全过程免费视频免费看| 亚洲成a人片77777kkkk| 成年人在线免费看视频| 91成人免费福利网站在线| 亚洲综合色婷婷在线观看| 亚洲欧洲一区二区三区| 日韩在线播放全免费| 日本永久免费a∨在线视频|