熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

實體bean的承諾

2013-11-23 18:42:53  來源: Java核心技術 

  我作為BEA的顧問已經成功地幫助客戶在各種版本的WebLogic Server (WLS)上設計並部署了應用程序BEA從EJB 已經開始支持容器管理(CMP)的實體beans並且已有一些客戶在使用它們可不幸的是一些客戶在不理解實體bean的情況下就使用上了它們而另一些客戶一聽說它會對性能有某些約束就完全從他們的結構/設計選擇上排除使用實體beans
  
  當面對系統分析師的詢問我究竟何時應該考慮去使用CMP方式的實體beans呢?的時候我很難解釋為什麼要使用CMP形式的實體beans實體beans的優勢體現在兩方面高速緩存和對象-關系的映射兩者在先前的版本中都勉強的被實現但EJB 拯救了這種情況WLS 在EJB 規范上的附加功能彌補了在使用實體beans和使用無狀態會話beans之間在性能方面的差距說明無狀態會話bean是通過DAO和JDBC訪問數據庫的在某些情況下實體bean甚至比無狀態會話bean執行的快當使用JDBC時強烈建議開發者使用容器管理的事務
  
  早期版本的問題
  
  一些在過去使用實體beans的客戶不得不重新設計和使用JDBC因為他們的系統太慢以至於無法滿足服務緩慢的原因在於
  
  
  沒有高速緩存 每個事務為了加載實體bean都訪問數據庫客戶在使用實體bean時所期望的承諾之一是緩存而對規則實體beans來說在集群環境中是沒有緩存可以使用的
  
  單一表支持 (OR 映射過分簡單化) 客戶也期望對象-關系映射可以由實體bean完成但是由容器提供映射功能過分簡單了
  
  每個虛擬機(VM)只能有該實體bean的單一實例由於WebLogic 和更低的版本只支持互斥鎖所有對實體bean的調用都是串行化的這樣會引起系統瓶頸甚至是對只讀beans
  
  互斥鎖 當一些beans在使用事件而另一些沒使用的時候死鎖發生的可能性很高
  
  單一setX調用這引起整個實體bean都被寫進數據庫在EJB 規范前容器對於判斷哪些內容發生了改變哪些沒有發生改變是沒有辦法的這意味著在ejbStore時所有的屬性都要更新
  
  裝載 裝載實體bean使所有的數據成員都裝進內存只需要幾個的時候
  
  無動態查詢 寫了一個新的查詢時EJB必須被重新部署
  
  查詢 查詢會實例化大量的實體beans消耗內存並且降低系統性能
  
  WLS 的特征
  
  WLS 實現了在EJB 中提供的豐富的對象-關系映射規范在優化讀寫數據庫方面EJB 也為容器提供了更豐富的便利下面說明了開發者在WLS 中設計實體beans方面所擁有的豐富和靈活的特征
  
  
  容器管理的關系 實體beans可以關聯其他的beans這些關系可以是雙向的或是單向的WLS支持三種類型的關系映射由WebLogic CMP管理一對一一對多多對多
  
  一個實體bean的多表映射多表的支持允許一個符合EJB 特征的CMP beans的實現器將一個EJB 映射為一個據庫中的多DBMS表
  
  調優EJB的寫操作當調用ejbStore時只更新寫進數據庫的字段而不是把所有字段都寫進數據庫
  
  使用字段組調優讀操作在ejbLoad容器只裝載fieldgroup中的字段而不是裝載實體bean的所有字段
  
  關系的緩存 這個特征提高實體bean的性能通過在某一個聯合查詢(非多重條件查詢)中緩存並裝載相關的beans
  
  實體beans可以返回ResultSets(記錄集)WLS 支持ejbSelect()查詢它在javasqlResultSet的表單中返回多列的查詢結果
  
  對不同種類的實體beans的應用級的緩存 代替對每個實體bean分散的緩存這個特征可以使多個實體beans 在一個EAR中共享一個單一運行時的緩存
  
  動態查詢 EJB 規范強制用戶在部署描述符中編寫查詢代碼通過采用動態查詢新的查詢可以通過程序被構造和執行而不用重新部署beans
  
  Readmostly設計模式在現實世界中大部分應用程序的% 為讀取而%為更新實體bean可以被寫成模擬數據並且可以部署為只讀實體bean和規范的實體bean通過這種方法想要讀取數據的用戶與只讀實體bean交互而想要修改數據的用戶與規則的實體bean交互當修改發生時容器使所有的只讀實體bean失效當數據訪問再次發生時迫使容器調用ejbLoad
  
  其他有用的特征包括自動生成主鍵支持級聯刪除支持EJB QL(Query Language查詢語言)ejbSelect方法以及下面所描述的並行策略
  
  並行策略
  
  並行策略定義一個實體bean創建多少實例為了維持事務的完整性誰來實現同步以及在實體bean中的數據模型存取模式恰當的並行策略可以使實體bean在性能上產生極大的不同
  
  
  互斥性對於每個VM實體bean容器只產生一個實例所有實體bean的調用都作為使用容器鎖的實體bean來串行化這絕不被推薦使用
  
  數據庫容器延期對數據庫的鎖定並且每個事務都有它自己實體bean的拷貝ejbLoad 和 ejbStore 在各自事務的開始和結束時被調用
  
  只讀實體beans 數據庫和容器都不支持任何的鎖每個事務得到它自己的實體bean的拷貝一個叫做的可配置參數用於控制實體bean調用ejbLoad方法EjbStore在實體bean上永遠不會被調用客戶端仍然可以在實體bean上進行創建移除和更新操作創建和移除操作會成功而由於不調用ejbStore更新操作將不會修改數據庫在只讀實體bean上不調用CUD(create update delete)方法是程序員的責任只讀實體bean對於分布式緩存問題是最好的解決方法
  
  開放式的實體beans 容器延期對數據庫的鎖定但是該鎖在事務期間不予以保留其基本思想是容器在提交前檢查修改了的數據並且如果其他人也修改了數據時將該操作回滾如果你想有比TX_READ_COMMITTED更高的一致性而不需要達到TX_ SERIALIZABLE那麼高的一致性時這樣做是很有用的如果你能忍受短時間讀取陳舊的數據而又想完成一些update操作的事務完整性時你可以使用它這裡有四個選項可用於檢查optimistic式沖突
  . 檢查讀取的列
  . 檢查修改的列
  . 檢查時間信息列
  . 檢查版本信息列
  
  選項是不被推薦的因為為適應這個並行策略表的結構需要改變
  同樣對於開放式並行策略你可以配置在事務為true和false期間你是否需要緩存對在事務期間設置為false的緩存將在每個事務開始的時候調用ejbLoad
  
  比較
  
  對於CMP總要有附加處理過程的這是由於在EJB容器以及容器層上(合成碼)有一個集成該容器層用於處理事務安全池態生命周期管理failover緩存和關系這裡CMP(由設計或由規范)必須做一些內部操作(ejbLoad ejbStore ejbActivate ejbPassivate)就像反對JDBC邏輯而由開發者自己手寫編程容器基礎結構的好處是優化並生成數據庫訪問加速開發以及簡化代碼維護
  在我見過的基准上除非數據是被緩存了的 [stateless session bean + DAO (做 JDBC訪問)] 執行比實體bean執行快%
  
  什麼時候使用什麼
  
  實體bean不能用來取代編寫JDBC如果你的對象-關系模型不是極度復雜(包括許多連接等等)和靈活並且對於工程代碼的維護比速度更重要時可以使用實體beans
  使用JDBC於簡單的原子級別綁定的更新使存儲過程和觸發器相結合並處理大量的ResultSets(記錄集)
  WebLogic附加的功能例如readmostly設計模式和開放式緩存cachebetweentransactions設置成true是兩種設計選擇它使實體beans成為吸引人的選擇它們都是BEA所特有的屬性在WebLogic特殊部署描述符中指定的當轉移到另一個適用JEE的應用服務器上時無需代碼變更對於應用來說通過使用開放式緩存並行策略可以在短時間讀取舊的數據
  對於大多數在讀取而少數時候更新的用例使用readmostly設計模式這種設計模式也有缺點就是用戶會讀取到過時的數據對於一些用戶完全不應讀取過時的數據的情況他們可以從讀寫bean讀取
  CMP實體beans的只讀實體beans的特征將在以後發布的EJB規范版本中有所提及使用只讀實體beans來實現一個可以周期性更新的分布式緩存
  
  結論
  
  現實世界中大多數的應用程序的讀操作比寫操作多很多現實中readmostly模式對兩種情況來說都將是最好的方法它提供簡單的開發和靈活的部署並且對於存取數據提供卓越的性能特性只有當數據被修改時才會有的額外開銷cachebetweentransactions設置成true的開放式的並行可以比JDBC還快編寫最優化的SQL對於正規的Java程序員來說很難所以不要忽略實體beans的價值並決定它們是否最適合
  
  實體Beans的例子
  
  提供的示例在BEAHOME/samples/server/src/ejb子目錄下
  
  
  論證關系的示例參看BEAHOME/samples/ server/src/ejb/relationships/bands目錄
  
  論證多表映射的例子參看BEAHOME/ samples/server/src/ejb/multitable 目錄
  
  使用數據庫並行選項在weblogicejbjarxml中指明Database
  
  使用只讀並行選項在weblogicejbjarxml中指明Readonly
  
  使用開放式並行cachebetweentransactions並且檢查改進的選項在weblogicejb jarxml中指明Optimistic True並且在weblogiccmprdbms jarxml中指明Modified
  實現readmostly設計模式注冊bean的實現就像兩個EJBs一個作為只讀另一個作為可讀寫的並且在weblogicejb jarxml中ejbname是只讀實體bean名字處添加ejbname

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25612.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.