OSGi應用于企業應用Step by step之持久篇

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

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

          評論

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

          頂一下,有沒有小例子!寫文檔的時候用畫圖的方式很好  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-26 09:18 螞蚱

          我覺得將所有PO和影射文件放入一個bundle有些不妥。而應該使用類似于Http Service的設計思路,將影射文件或hibernatecfg.xml注冊到一個統一的Hibernate Service 中,但我還沒有細想,如果有時間我會仔細考慮一下,寫個blog與大家共享。  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-26 14:26 BlueDavy

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

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-27 20:38 deardream

          不知道OSGI能否處理Hibernate中一個很麻煩的問題:動態屬性變化?

          運行期給某個PO類添加一個property,級聯的在某表中增加一個字段。。。

          以前似乎是比較麻煩,除非自己弄個classLoader,現在通過OSGI是否能解決這個問題?  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-27 20:43 BlueDavy

          @deardream
          ...這個和是否使用OSGi沒關系,是Hibernate本身的問題...
          當然,我們可以在OSGi+Hibernate的基礎上做個擴展來支持這樣的動態性。  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-28 11:43 deardream

          這確實是Hibernate的問題,Hibernate也給出了Dynamic Model來解決這個問題,但是Dynamic Model就破壞了面向對象的很多優勢(聚合、繼承),而如果用靜態對象的手段,又面向動態屬性變化的問題。

          我期望的是依賴OSGI來解決運行期對象動態改變和加載的問題。  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-28 12:30 BlueDavy

          @deardream
          嗯,沒錯,可以基于OSGi的思想做個Hibernate的擴展..
            回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-28 13:06 guitarpoet

          OSGI的環境就是一個非常經典的SOA環境,把思路限制在O/R Mapping身上就錯了。

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

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

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

          如果再結合Annotation,可以實現腳本動態交織,能達到的效果是不可想象的。更有趣的是,這樣在理論上并不會比Hibernate的動態解析HQL然后生成SQL效率低。而且,我個人覺得用MixIn的方式更面向對象。

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

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

          @BlueDavy

          我想過這個問題,但是Httpservice中注冊的Servlet不也是在其他bundle中嗎。是否因為Httpservice是系統服務,所以他可以調用其他bundle中的servlet和相關類。由于是從你的系列文章中學的osgi,研究不深,還請多多指教。  回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-09-28 16:09 BlueDavy

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

          @螞蚱
          ...HttpService的處理機制不同,因為在注冊servlet時是直接把servlet實例給注冊過去的,而在Hibernate那邊則不能這樣...  回復  更多評論   

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

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

            回復  更多評論   

          # re: OSGi應用于企業應用Step by step之持久篇 2006-11-08 17:23 BlueDavy

          @生與夏花
          嗯,沒錯,做法確實差不多是這樣..
          不過既然現在spring & osgi要出來了,可以看看是不是可以直接用
            回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

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

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 揭西县| 长治县| 新乐市| 武乡县| 巴林左旗| 游戏| 黔南| 中西区| 三原县| 大悟县| 荔浦县| 平原县| 焉耆| 常州市| 永济市| 安乡县| 沽源县| 叙永县| 通州区| 鸡东县| 杭锦旗| 信阳市| 彭阳县| 高阳县| 嵊泗县| 义乌市| 许昌市| 桃园县| 天台县| 津市市| 德江县| 黎平县| 尼玛县| 金阳县| 巴南区| 安远县| 云霄县| 灵石县| 拉萨市| 贵港市| 桦南县|