OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇

          在企業(yè)應(yīng)用中,持久化無(wú)疑是其中非常重要的一環(huán),盡管OSGi的規(guī)范中也有負(fù)責(zé)持久數(shù)據(jù)、屬性的服務(wù)規(guī)范,但對(duì)于企業(yè)應(yīng)用而言那些顯然是不夠的,這里就以目前Java界流行的Hibernate為例來(lái)看看如何集成Hibernate到OSGi中,使得我們能夠很簡(jiǎn)單在OSGi中使用Hibernate進(jìn)行持久化。
          首先來(lái)看看在傳統(tǒng)的Java應(yīng)用中,是如何使用Hibernate的,在不使用類似spring ORM Template這些封裝了Hibernate東西的情況下,通常都是對(duì)外提供一個(gè)公共的封裝了通用操作的Dao類,方便其他的Dao或者Service直接使用,在集成到OSGi中仍然希望是如此,那么這步怎么做呢?
          非常的簡(jiǎn)單,在Eclipse中新建一個(gè)Plugin Project,然后把Hibernate所需要的lib放入project的lib中,將在傳統(tǒng)Java應(yīng)用中的象HibernateUtil、CommonDao這些類直接copy到當(dāng)前project中,CommonDao是需要暴露給其他的Plugin project使用的,這里就需要將CommonDao的package加入到Project的export-package描述中了,接下來(lái)就是基于DS的方式對(duì)外提供CommonDao服務(wù)。
          通過上面這樣的方法就已經(jīng)可以在基于OSGi的應(yīng)用中使用CommonDao來(lái)完成持久化層的操作了,但這時(shí)會(huì)發(fā)現(xiàn)有個(gè)問題,在HibernateUtil這樣的提供session管理的類中通常需要指定hibernatecfg.xml的位置,那么按照上面的做法自然是只能在上面的plugin project中放置這個(gè)文件了,在這個(gè)文件中配置了需要加載的po的映射文件,這樣呢,就使得目前基于OSGi的應(yīng)用需要將系統(tǒng)中所有的持久PO都放入這個(gè)Project中,而不是放入各自獨(dú)立的Plugin Project中,而Dao則可以放到各自獨(dú)立的Plugin Project中去,基于這樣的方法,就構(gòu)成了在基于OSGi的應(yīng)用中通常是如下的方式:
          Hibernate Bundle.png
          還有一個(gè)方法就是每個(gè)Plugin Project維護(hù)自己的hibernate.cfg.xml,這樣各自的po也就可以放在各自獨(dú)立的Plugin project中,但這樣的方法帶來(lái)的問題就是各個(gè)Plugin project都會(huì)產(chǎn)生一個(gè)Hibernate SessionFactory,而且當(dāng)系統(tǒng)的持久模型較為復(fù)雜的時(shí)候就更麻煩了,一個(gè)PO需要存在在幾個(gè)Plugin Project中的時(shí)候,那樣就會(huì)出現(xiàn)session中數(shù)據(jù)不一致的現(xiàn)象,所以暫時(shí)不去采用這種方法。
          當(dāng)然,相信將來(lái)會(huì)有更好的方式,需要解決的主要是統(tǒng)一加載各plugin project中的映射文件、PO的加載,在目前的情況下,要形成一個(gè)對(duì)外封閉的通用Hibernate Plugin Project還是很麻煩的,這種現(xiàn)象在集成MVC框架等等的時(shí)候都是會(huì)碰到的,這也反應(yīng)了傳統(tǒng)的開源框架在對(duì)于這種真正模塊化的方式上的支撐仍然是非常不夠的,傳統(tǒng)的開源框架更多的停留于概念上的模塊化。

          posted on 2006-09-26 00:32 BlueDavy 閱讀(4511) 評(píng)論(12)  編輯  收藏 所屬分類: OSGi、SOA、SCA

          評(píng)論

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 08:29 壞男孩

          頂一下,有沒有小例子!寫文檔的時(shí)候用畫圖的方式很好  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 09:18 螞蚱

          我覺得將所有PO和影射文件放入一個(gè)bundle有些不妥。而應(yīng)該使用類似于Http Service的設(shè)計(jì)思路,將影射文件或hibernatecfg.xml注冊(cè)到一個(gè)統(tǒng)一的Hibernate Service 中,但我還沒有細(xì)想,如果有時(shí)間我會(huì)仔細(xì)考慮一下,寫個(gè)blog與大家共享。  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 14:26 BlueDavy

          @螞蚱
          如果只是hibernate.cfg.xml的問題就好辦了,你有沒有考慮如果po放在各自bundle的時(shí)候那怎么去加載那些po呢,固然,不要忘了在OSGi中bundle中的類是獨(dú)立加載的,這個(gè)和傳統(tǒng)模式是完全不一樣的。
          不過你說的用統(tǒng)一的Hibernate Service的方法確實(shí)是可以的,不過要基于Hibernate做出一些改動(dòng),特別是在加載po class以及映射文件方面。
          其實(shí)對(duì)于采用分層開發(fā)的團(tuán)隊(duì)來(lái)講這不是問題。  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-27 20:38 deardream

          不知道OSGI能否處理Hibernate中一個(gè)很麻煩的問題:動(dòng)態(tài)屬性變化?

          運(yùn)行期給某個(gè)PO類添加一個(gè)property,級(jí)聯(lián)的在某表中增加一個(gè)字段。。。

          以前似乎是比較麻煩,除非自己弄個(gè)classLoader,現(xiàn)在通過OSGI是否能解決這個(gè)問題?  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-27 20:43 BlueDavy

          @deardream
          ...這個(gè)和是否使用OSGi沒關(guān)系,是Hibernate本身的問題...
          當(dāng)然,我們可以在OSGi+Hibernate的基礎(chǔ)上做個(gè)擴(kuò)展來(lái)支持這樣的動(dòng)態(tài)性。  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 11:43 deardream

          這確實(shí)是Hibernate的問題,Hibernate也給出了Dynamic Model來(lái)解決這個(gè)問題,但是Dynamic Model就破壞了面向?qū)ο蟮暮芏鄡?yōu)勢(shì)(聚合、繼承),而如果用靜態(tài)對(duì)象的手段,又面向動(dòng)態(tài)屬性變化的問題。

          我期望的是依賴OSGI來(lái)解決運(yùn)行期對(duì)象動(dòng)態(tài)改變和加載的問題。  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 12:30 BlueDavy

          @deardream
          嗯,沒錯(cuò),可以基于OSGi的思想做個(gè)Hibernate的擴(kuò)展..
            回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 13:06 guitarpoet

          OSGI的環(huán)境就是一個(gè)非常經(jīng)典的SOA環(huán)境,把思路限制在O/R Mapping身上就錯(cuò)了。

          完全可以采用別的方式,我舉兩個(gè):

          1、采用ActiveRecord模式,中間需要一個(gè)從Domain Object到Active Record的數(shù)據(jù)遷移。
          2、采用AOP的模式,在持久化操作時(shí)給Domain Object mixin持久化操作。

          有趣的是OSGI只知道你是Service,根本不會(huì)管你到底是什么。那么,就可以讓腳本語(yǔ)言出馬啦。

          如果再結(jié)合Annotation,可以實(shí)現(xiàn)腳本動(dòng)態(tài)交織,能達(dá)到的效果是不可想象的。更有趣的是,這樣在理論上并不會(huì)比Hibernate的動(dòng)態(tài)解析HQL然后生成SQL效率低。而且,我個(gè)人覺得用MixIn的方式更面向?qū)ο蟆?

          我現(xiàn)在就有這樣作的打算,我的初步想法是通過JRuby和OSGI把ActiveRecord這種模式以Service的方式實(shí)現(xiàn),有想法的話可以跟我討論。
          Mail: guitarpoet@gmail.com  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 13:38 螞蚱

          @BlueDavy

          我想過這個(gè)問題,但是Httpservice中注冊(cè)的Servlet不也是在其他bundle中嗎。是否因?yàn)镠ttpservice是系統(tǒng)服務(wù),所以他可以調(diào)用其他bundle中的servlet和相關(guān)類。由于是從你的系列文章中學(xué)的osgi,研究不深,還請(qǐng)多多指教。  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 16:09 BlueDavy

          @guitarpoet
          ...我沒有說僅限于O/R Mapping,只是以Hibernate來(lái)舉個(gè)例子而已....
          每個(gè)公司都有其穩(wěn)定的一種持久的方案,總不能強(qiáng)制別人用Hibernate的就一定要用你的方案呀...

          @螞蚱
          ...HttpService的處理機(jī)制不同,因?yàn)樵谧?cè)servlet時(shí)是直接把servlet實(shí)例給注冊(cè)過去的,而在Hibernate那邊則不能這樣...  回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-11-08 15:46 生與夏花

          如果借用Equniox的強(qiáng)大的擴(kuò)展點(diǎn)機(jī)制是不是可以容易點(diǎn)。
          1 。修改hibernate的配置文件加載機(jī)制,讓他從registry中動(dòng)態(tài)的加載配置.
          2 。修改hiberante的hibernate.cfg.xml配置文件加載機(jī)制讓他可以從Config Admin中存取做到動(dòng)態(tài)的配置。
          3 。修改equniox的classLoader加載機(jī)制,讓他可以從client端的bundler中加載類或者文件。這個(gè)可以參考spring-osgi中的classLoader加載機(jī)制。
          4 。這樣就可以以模塊化的方法進(jìn)行設(shè)計(jì)hibernate,每個(gè)domain對(duì)象和對(duì)應(yīng)的映射文件都可以放在獨(dú)立的bundler中,把這個(gè)bundler作為第一部中hibernate的Extension points加以配置。
          注:如果不想利用equniox的擴(kuò)展點(diǎn)機(jī)制,可以使用 “BlueDavy ”在他blog中提到的可以自己實(shí)現(xiàn)一個(gè)擴(kuò)展點(diǎn)模型的實(shí)現(xiàn)。
          這個(gè)實(shí)現(xiàn)如果是jboss的事項(xiàng)者來(lái)做應(yīng)該是很簡(jiǎn)單的,如果是個(gè)人拿就得研究一下hibernate的原代碼了,但是也不用全研究制止配置部分。

            回復(fù)  更多評(píng)論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-11-08 17:23 BlueDavy

          @生與夏花
          嗯,沒錯(cuò),做法確實(shí)差不多是這樣..
          不過既然現(xiàn)在spring & osgi要出來(lái)了,可以看看是不是可以直接用
            回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統(tǒng)計(jì)

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 湾仔区| 吴忠市| 太原市| 枣阳市| 伊吾县| 林口县| 丰顺县| 砚山县| 乐昌市| 柞水县| 绥德县| 绵阳市| 自治县| 眉山市| 上林县| 灵丘县| 思茅市| 朝阳市| 庐江县| 什邡市| 保定市| 上蔡县| 昌都县| 通化县| 荔波县| 巴青县| 河北区| 平原县| 五家渠市| 三门峡市| 乐业县| 崇左市| 喀喇沁旗| 锡林郭勒盟| 凌源市| 宽甸| 阳谷县| 汤原县| 武山县| 河曲县| 堆龙德庆县|