国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

實(shí)體bean的承諾

2019-11-18 12:11:34
字體:
供稿:網(wǎng)友

  我作為BEA的顧問,已經(jīng)成功地幫助客戶在各種版本的WebLogic Server (WLS)上設(shè)計(jì)并部署了應(yīng)用程序。BEA從EJB 1.0已經(jīng)開始支持容器治理(CMP)的實(shí)體beans,并且已有一些客戶在使用它們。可不幸的是,一些客戶在不理解實(shí)體bean的情況下就使用上了它們;而另一些客戶一聽說它會(huì)對(duì)性能有某些約束,就完全從他們的結(jié)構(gòu)/設(shè)計(jì)選擇上排除使用實(shí)體beans。
  
  當(dāng)面對(duì)系統(tǒng)分析師的詢問"我究竟何時(shí)應(yīng)該考慮去使用CMP方式的實(shí)體beans呢?"的時(shí)候,我很難解釋為什么要使用CMP形式的實(shí)體beans。實(shí)體beans的優(yōu)勢(shì)體現(xiàn)在兩方面:高速緩存和對(duì)象-關(guān)系的映射。兩者在先前的版本中都勉強(qiáng)的被實(shí)現(xiàn),但EJB 2.0拯救了這種情況。WLS 7.0在EJB 2.0規(guī)范上的附加功能彌補(bǔ)了在使用實(shí)體beans和使用無狀態(tài)會(huì)話beans之間在性能方面的差距,說明:無狀態(tài)會(huì)話bean是通過DAO和JDBC訪問數(shù)據(jù)庫的,在某些情況下實(shí)體bean甚至比無狀態(tài)會(huì)話bean執(zhí)行的快。當(dāng)使用JDBC時(shí),強(qiáng)烈建議開發(fā)者使用容器治理的事務(wù)。
  
  早期版本的問題
  
  一些在過去使用實(shí)體beans的客戶不得不重新設(shè)計(jì)和使用JDBC,因?yàn)樗麄兊南到y(tǒng)太慢以至于無法滿足服務(wù)。緩慢的原因在于:
  
  
  沒有高速緩存: 每個(gè)事務(wù)為了加載實(shí)體bean都訪問數(shù)據(jù)庫。客戶在使用實(shí)體bean時(shí)所期望的承諾之一是緩存,而對(duì)規(guī)則實(shí)體beans來說在集群環(huán)境中是沒有緩存可以使用的。
  
  單一表支持 (O-R 映射過分簡(jiǎn)單化): 客戶也期望對(duì)象-關(guān)系映射可以由實(shí)體bean完成,但是由容器提供映射功能過分簡(jiǎn)單了。
  
  每個(gè)虛擬機(jī)(VM)只能有該實(shí)體bean的單一實(shí)例:由于WebLogic 5.1和更低的版本只支持互斥鎖,所有對(duì)實(shí)體bean的調(diào)用都是串行化的,這樣會(huì)引起系統(tǒng)瓶頸甚至是對(duì)只讀beans。
  
  互斥鎖 :當(dāng)一些beans在使用事件而另一些沒使用的時(shí)候,死鎖發(fā)生的可能性很高。
  
  單一setX調(diào)用:這引起整個(gè)實(shí)體bean都被寫進(jìn)數(shù)據(jù)庫。在EJB 2.0 規(guī)范前,容器對(duì)于判定哪些內(nèi)容發(fā)生了改變哪些沒有發(fā)生改變是沒有辦法的,這意味著在ejbStore時(shí),所有的屬性都要更新。
  
  裝載 :裝載實(shí)體bean,使所有的數(shù)據(jù)成員都裝進(jìn)內(nèi)存,只需要幾個(gè)的時(shí)候。
  
  無動(dòng)態(tài)查詢 :寫了一個(gè)新的查詢時(shí),EJB必須被重新部署。
  
  查詢 :查詢會(huì)實(shí)例化大量的實(shí)體beans,消耗內(nèi)存并且降低系統(tǒng)性能。
  
  WLS 7.0的特征
  
  WLS 7.0 實(shí)現(xiàn)了在EJB 2.0中提供的豐富的對(duì)象-關(guān)系映射規(guī)范。在優(yōu)化讀寫數(shù)據(jù)庫方面EJB 2.0也為容器提供了更豐富的便利。下面說明了開發(fā)者在WLS 7.0 中設(shè)計(jì)實(shí)體beans方面所擁有的豐富和靈活的特征。
  
  
  容器治理的關(guān)系 :實(shí)體beans可以關(guān)聯(lián)其他的beans;這些關(guān)系可以是雙向的或是單向的。WLS支持三種類型的關(guān)系映射,由WebLogic CMP治理:一對(duì)一,一對(duì)多,多對(duì)多。
  
  一個(gè)實(shí)體bean的多表映射:多表的支持答應(yīng)一個(gè)符合EJB 2.0特征的CMP beans的實(shí)現(xiàn)器將一個(gè)EJB 映射為一個(gè)據(jù)庫中的多DBMS表。
  
  調(diào)優(yōu)EJB2.0的寫操作:當(dāng)調(diào)用ejbStore時(shí)只更新寫進(jìn)數(shù)據(jù)庫的字段,而不是把所有字段都寫進(jìn)數(shù)據(jù)庫。
  
  使用字段組調(diào)優(yōu)讀操作:在ejbLoad容器,只裝載field-group中的字段,而不是裝載實(shí)體bean的所有字段。
  
  關(guān)系的緩存: 這個(gè)特征提高實(shí)體bean的性能,通過在某一個(gè)聯(lián)合查詢(非多重條件查詢)中緩存并裝載相關(guān)的beans。
  
  實(shí)體beans可以返回ResultSets(記錄集):WLS 支持ejbSelect()查詢,它在java.sql.ResultSet的表單中返回多列的查詢結(jié)果。
  
  對(duì)不同種類的實(shí)體beans的應(yīng)用級(jí)的緩存: 代替對(duì)每個(gè)實(shí)體bean分散的緩存,這個(gè)特征可以使多個(gè)實(shí)體beans 在一個(gè)EAR中共享一個(gè)單一運(yùn)行時(shí)的緩存。
  
  動(dòng)態(tài)查詢: EJB 2.0規(guī)范強(qiáng)制用戶在部署描述符中編寫查詢代碼。通過采用動(dòng)態(tài)查詢,新的查詢可以通過程序被構(gòu)造和執(zhí)行而不用重新部署beans。
  
  Read-mostly設(shè)計(jì)模式:在現(xiàn)實(shí)世界中,大部分應(yīng)用程序的90% 為讀取而10%為更新。實(shí)體bean可以被寫成模擬數(shù)據(jù)并且可以部署為只讀實(shí)體bean和規(guī)范的實(shí)體bean。通過這種方法,想要讀取數(shù)據(jù)的用戶與只讀實(shí)體bean交互,而想要修改數(shù)據(jù)的用戶與規(guī)則的實(shí)體bean交互。當(dāng)修改發(fā)生時(shí),容器使所有的只讀實(shí)體bean失效,當(dāng)數(shù)據(jù)訪問再次發(fā)生時(shí)迫使容器調(diào)用ejbLoad。
  
  其他有用的特征包括:自動(dòng)生成主鍵,支持級(jí)聯(lián)刪除,支持EJB QL(Query Language,查詢語言),ejbSelect方法,以及下面所描述的并行策略。
  
  并行策略
  
  并行策略定義一個(gè)實(shí)體bean創(chuàng)建多少實(shí)例,為了維持事務(wù)的完整性誰來實(shí)現(xiàn)同步以及在實(shí)體bean中的數(shù)據(jù)模型存取模式。恰當(dāng)?shù)牟⑿胁呗钥梢允箤?shí)體bean在性能上產(chǎn)生極大的不同。
  
  
  互斥性:對(duì)于每個(gè)VM實(shí)體bean容器只產(chǎn)生一個(gè)實(shí)例,所有實(shí)體bean的調(diào)用都作為使用容器鎖的實(shí)體bean來串行化。這絕不被推薦使用。
  
  數(shù)據(jù)庫:容器延期對(duì)數(shù)據(jù)庫的鎖定,并且每個(gè)事務(wù)都有它自己實(shí)體bean的拷貝。ejbLoad 和 ejbStore 在各自事務(wù)的開始和結(jié)束時(shí)被調(diào)用。
  
  只讀實(shí)體beans: 數(shù)據(jù)庫和容器都不支持任何的鎖,每個(gè)事務(wù)得到它自己的實(shí)體bean的拷貝。一個(gè)叫做的可配置參數(shù)用于控制實(shí)體bean調(diào)用ejbLoad方法。EjbStore在實(shí)體bean上永遠(yuǎn)不會(huì)被調(diào)用。客戶端仍然可以在實(shí)體bean上進(jìn)行創(chuàng)建,移除和更新操作。創(chuàng)建和移除操作會(huì)成功,而由于不調(diào)用ejbStore,更新操作將不會(huì)修改數(shù)據(jù)庫。在只讀實(shí)體bean上不調(diào)用CUD(create, update, delete)方法是程序員的責(zé)任。只讀實(shí)體bean對(duì)于"分布式緩存"問題是最好的解決方法。
  
  開放式的實(shí)體beans :容器延期對(duì)數(shù)據(jù)庫的鎖定,但是該鎖在事務(wù)期間不予以保留。其基本思想是容器在提交前檢查修改了的數(shù)據(jù)并且假如其他人也修改了數(shù)據(jù)時(shí),將該操作回滾。假如你想有比TX_READ_COMMITTED更高的一致性,而不需要達(dá)到TX_ SERIALIZABLE那么高的一致性時(shí)這樣做是很有用的。假如你能忍受短時(shí)間讀取陳舊的數(shù)據(jù),而又想完成一些update操作的事務(wù)完整性時(shí),你可以使用它。這里有四個(gè)選項(xiàng)可用于檢查optimistic式?jīng)_突:
  1. 檢查讀取的列
  2. 檢查修改的列
  3. 檢查時(shí)間信息列
  4. 檢查版本信息列
  
  選項(xiàng)3和4是不被推薦的,因?yàn)闉檫m應(yīng)這個(gè)并行策略,表的結(jié)構(gòu)需要改變。
  同樣,對(duì)于開放式并行策略,你可以配置在事務(wù)為true和false期間你是否需要緩存。對(duì)在事務(wù)期間設(shè)置為false的緩存,將在每個(gè)事務(wù)開始的時(shí)候調(diào)用ejbLoad。
  
  比較
  
  對(duì)于CMP,總要有附加處理過程的,這是由于在EJB容器以及容器層上(合成碼)有一個(gè)集成,該容器層用于處理事務(wù)、安全、池態(tài)、生命周期治理、failover、緩存和關(guān)系。這里。CMP(由設(shè)計(jì)或由規(guī)范)必須做一些內(nèi)部操作(ejbLoad, ejbStore, ejbActivate, ejbPassivate)就像反對(duì)JDBC邏輯而由開發(fā)者自己手寫編程。容器基礎(chǔ)結(jié)構(gòu)的好處是優(yōu)化并生成數(shù)據(jù)庫訪問;加速開發(fā)以及簡(jiǎn)化代碼維護(hù)。
  在我見過的基準(zhǔn)上,除非數(shù)據(jù)是被緩存了的, [stateless session bean + DAO (做 JDBC訪問)] 執(zhí)行比實(shí)體bean執(zhí)行快30-50%。
  
  什么時(shí)候使用什么
  
  實(shí)體bean不能用來取代編寫JDBC。假如你的對(duì)象-關(guān)系模型不是極度復(fù)雜(包括許多連接,等等)和靈活并且對(duì)于工程代碼的維護(hù)比速度更重要時(shí)可以使用實(shí)體beans。
  使用JDBC于簡(jiǎn)單的,原子級(jí)別綁定的更新;使存儲(chǔ)過程和觸發(fā)器相結(jié)合;并處理大量的ResultSets(記錄集)。
  WebLogic附加的功能例如read-mostly設(shè)計(jì)模式和開放式緩存cache-between-transactions設(shè)置成true是兩種設(shè)計(jì)選擇,它使實(shí)體beans成為吸引人的選擇。它們都是BEA所特有的屬性,在WebLogic非凡部署描述符中指定的。當(dāng)轉(zhuǎn)移到另一個(gè)適用J2EE的應(yīng)用服務(wù)器上時(shí)無需代碼變更。對(duì)于應(yīng)用來說通過使用開放式緩存并行策略可以在短時(shí)間讀取舊的數(shù)據(jù)。
  對(duì)于大多數(shù)在讀取而少數(shù)時(shí)候更新的用例,使用read-mostly設(shè)計(jì)模式。這種設(shè)計(jì)模式也有缺點(diǎn),就是用戶會(huì)讀取到過時(shí)的數(shù)據(jù)。對(duì)于一些用戶完全不應(yīng)讀取過時(shí)的數(shù)據(jù)的情況,他們可以從讀寫bean讀取。
  CMP實(shí)體beans的只讀實(shí)體beans的特征將在以后發(fā)布的EJB規(guī)范版本中有所提及。使用只讀實(shí)體beans來實(shí)現(xiàn)一個(gè)可以周期性更新的分布式緩存。
  
  結(jié)論
  
  現(xiàn)實(shí)世界中大多數(shù)的應(yīng)用程序的讀操作比寫操作多很多。現(xiàn)實(shí)中read-mostly模式對(duì)兩種情況來說都將是最好的方法。它提供簡(jiǎn)單的開發(fā)和靈活的部署,并且對(duì)于存取數(shù)據(jù)提供卓越的性能特性,只有當(dāng)數(shù)據(jù)被修改時(shí)才會(huì)有的額外開銷。cache-between-transactions設(shè)置成true的開放式的并行可以比JDBC還快。編寫最優(yōu)化的SQL對(duì)于正規(guī)的Java程序員來說很難,所以不要忽略實(shí)體beans的價(jià)值并決定它們是否最適合。
  
  實(shí)體Beans的例子
  
  提供的示例在BEA-HOME/samples/server/src/ejb20子目錄下。
  
  
  論證關(guān)系的示例參看BEA-HOME/samples/ server/src/ejb20/relationships/bands目錄。
  
  論證多表映射的例子參看BEA-HOME/ samples/server/src/ejb20/multitable 目錄。
  
  使用數(shù)據(jù)庫并行選項(xiàng)在weblogic-ejb-jar.xml中指明Database
  
  使用只讀并行選項(xiàng)在weblogic-ejb-jar.xml中指明Read-only
  
  使用開放式并行cache-between-transactions并且檢查改進(jìn)的選項(xiàng)在weblogic-ejb- jar.xml中指明Optimistic True并且在weblogic-cmp-rdbms -jar.xml中指明Modified。
  實(shí)現(xiàn)"read-mostly"設(shè)計(jì)模式注冊(cè)bean的實(shí)現(xiàn)就像兩個(gè)EJBs,一個(gè)作為只讀另一個(gè)作為可讀寫的,并且在weblogic-ejb -jar.xml中ejbname是只讀實(shí)體bean名字處添加ejbname 。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉禾县| 万荣县| 石屏县| 名山县| 顺义区| 德庆县| 光山县| 渝中区| 阜新市| 门头沟区| 明水县| 兴安盟| 古交市| 台北市| 顺义区| 茌平县| 堆龙德庆县| 临夏市| 高尔夫| 茂名市| 丰原市| 黑龙江省| 邢台县| 秭归县| 墨竹工卡县| 军事| 乌审旗| 苍南县| 泊头市| 探索| 遂溪县| 交口县| 岳普湖县| 中宁县| 渝北区| 克拉玛依市| 衡南县| 邛崃市| 县级市| 临沭县| 台前县|