EJB 學(xué)習筆記1、ejb 基礎知識(1) 無(wú)狀態(tài)會(huì )話(huà)bean 不保存客戶(hù)機的會(huì )話(huà)狀態(tài) 優(yōu)點(diǎn):使用小量的實(shí)例即可滿(mǎn)足大量的客戶(hù)。每個(gè)實(shí)例都沒(méi)有標識,相互之間是等價(jià)的。 等?的無(wú)狀態(tài)會(huì )話(huà)bean: 多次和一次調用的結果和效應相同。 在集群中可以負載均衡 a 機器失敗,可以在b機器上重試 非等?的無(wú)狀態(tài)會(huì )話(huà)bean: 如:計數器 不能自動(dòng)因故障而進(jìn)行切換。(2) 有狀態(tài)會(huì )話(huà)bean 保存客戶(hù)機的會(huì )話(huà)狀態(tài) 特點(diǎn): 在有會(huì )話(huà)狀態(tài)會(huì )話(huà)的bean例子中,出納員的數量等于活動(dòng)的顧客的數量,這可以簡(jiǎn)化編程模式 weblogic 通過(guò)內存復制技術(shù) 在集群中進(jìn)行負載均衡 內存復制技術(shù): 每個(gè)有會(huì )話(huà)狀態(tài)的bean實(shí)例都將存儲在兩個(gè)服務(wù)器的內存中,一個(gè)服務(wù)器作為主服務(wù)器,另一個(gè)作為輔助服務(wù)器。 如果主失敗,輔助變?yōu)橹?,然后自?dòng)選擇別的可用的服務(wù)器作為輔助。 遺憾: 很難在servlet 和jsp中用好有狀態(tài)會(huì )話(huà)bean??赡軙?huì )發(fā)生并發(fā)現象,產(chǎn)生RemoteException weblogic 的
可以封鎖任何并發(fā)的調用。 同步: 可以有選擇地實(shí)現 javax.ejb.SessionSynchronization接口 afeterBegin() //進(jìn)入事務(wù)時(shí) beforeCompletion() //提交事務(wù)前,用于提交前把緩存的數據寫(xiě)到數據庫中. afterCompletion() //提交事務(wù)后,用于釋放共享資源或者更新事務(wù)提交和終止方面的統計信息. 會(huì )話(huà)bean通過(guò)其 SessionContext 對象中的 getUserTransaction() 方法,取得對UserTransaction的應用 通常 SessionContext 被存放在成員變量中 ** 記住是在調用ejb.create()方法前調用 setUserTransaction() 方法 利用對 UserTransaction 的引用會(huì )話(huà)可以使用 begin() 、commit()、rollback() 方法界定一個(gè)事務(wù). (3) 實(shí)體 bean: 它有一個(gè)主健作為唯一的標識符 組成部分: 由本地接口、遠程接口、bean類(lèi)、主健類(lèi)和配置描述器組成。 本地接口: 擴展了javax.ejb.EJBHome接口,包括create()、remove()、finder 和home等方法 1)create()方法調用bean類(lèi)中的ejbCreate()方法。相當于數據的insert 方法。 2)remove()方法相當于數據庫的delete操作。 3)finder()方法,使客戶(hù)能夠查詢(xún)和接收滿(mǎn)足查詢(xún)條件的實(shí)體bean的引用。每個(gè)實(shí)體bean的本地接口中都必須 有一個(gè)findByPrimaryKey() 方法 4)home 方法,類(lèi)似于無(wú)狀態(tài)會(huì )話(huà)bean。 主健類(lèi): 實(shí)體bean必須包括一個(gè)主健類(lèi),主健類(lèi)用于標識實(shí)體bean實(shí)例,而且實(shí)體bean數據類(lèi)型必須是唯一的。 主健類(lèi)可以是java的基本類(lèi)型String Integer 也可以是用戶(hù)自定義的。 也可以是多個(gè)字段的主健的復合主健。 bean 類(lèi)和bean的上下文環(huán)境: 實(shí)現javax.ejb.EJBObject 接口,其中包含業(yè)務(wù)方法的語(yǔ)法格式定義. bean 類(lèi)實(shí)現了javax.ejb.EntityBean接口,同javax.ejb.SessionBean接口一樣,EntityBean 接口包含了EJB 容器調用bean實(shí)例的語(yǔ)法格式. 在bean的構造器執行之后,立即調用setEntityContext() 方法,同時(shí)把bean實(shí)例的EntityContext 傳遞給它. bean類(lèi)實(shí)現了home方法和遠程接口中的業(yè)務(wù)方法,home方法是針對匿名實(shí)例的方法不應使用有關(guān)的主健值. 分為: 容器管理持久性(Container-Managerd Persistence)CMP 特點(diǎn): EJB 容器自動(dòng)生成,用于把實(shí)體bean的數據寫(xiě)入到數據庫中。 優(yōu)點(diǎn): bean作者可以避免編寫(xiě)實(shí)體bean與關(guān)系數據庫數據訪(fǎng)問(wèn)方面的代碼。cmp將自動(dòng)處理這一過(guò)程。 個(gè)性: 每一個(gè)cmp 實(shí)體bean 都有一組容器管理的字段,這些字段存儲在數據庫,并可從中加載.通常,每個(gè)容器管理的字段都對應于 關(guān)系數據庫中的一個(gè)列. 容器管理的每個(gè)字段必須在ejb-jar.xml中定義,這使容器能夠把容器管理的字段與bean類(lèi)中的set和get方法進(jìn)行匹配比較. 另外,bean作者可以增加另外一個(gè)cmp配置描述文件 weblogic-cmp-rdbms.xml,其中包含數據庫表名和每個(gè)容器管理的字 段和相應的數據列的映射. bean管理持久性(Bean-Managerd Persistence ) BMP 特點(diǎn): 在bmp實(shí)體中,bean作者需要自己編寫(xiě)數據庫訪(fǎng)問(wèn)代碼,也就是編寫(xiě)JDBC代碼,插入、刪除和查詢(xún)數據庫中的實(shí)體bean數據。 優(yōu)點(diǎn): 可以讓bean的作者完全靈活的處理實(shí)體bean的持久性數據,因為作者需要寫(xiě)數據訪(fǎng)問(wèn)的代碼,他幾乎可以使用任何持久性存 儲方式ejb2.0 cmp提供實(shí)體bean之間的標準關(guān)系映射,使容器能自動(dòng)管理業(yè)務(wù)對象之間的交互。 cmp擁有更多的訪(fǎng)問(wèn)控制,因此cmp比bmp有較好的性能。(4) 消息 bean 把JMS 和EJB 成功結合在一起,集成的結果 特點(diǎn):客戶(hù)機不需要調用消息bean 相反: 客戶(hù)機只需要發(fā)一個(gè)消息給jMS目的。 在消息到達以后,消息bean的onmessage()方法將被調用,以處理這個(gè)消息。 消息bean用于在服務(wù)器中執行異步操作。2。EJB 組成(1)遠程接口 public interface HelloWord extents EJBObject { //EJBObject 接口方法 EJBHome getEJBHome() throws RemoteException; Object getPrimaryKey() throws RemoteException; void remove() throws RemoteException, RemoveException; Handle getHandle() throws RemoteException; boolean isIdentical(EJBObject ejbObject) throws RemoteException; }(2)本地接口 本地接口是ejb工廠(chǎng),客戶(hù)機可以使用本地接口創(chuàng )建、找出和刪除ejb實(shí)例。只需寫(xiě)本地接口中的方法的語(yǔ)法調用格式 public class HelloWorldHome extends EJBHome { //EJBHome 接口方法 void remove(Handle handle) throws RemoteException, RemoveException; void remove(Object o) throws RemoteException, RemoveException; EJBMetaData getEJBMetaData() throws RemoteException; HomeHandle getHomeHandle() throws RemoteException; // Home public HelloWorld create() throws CreateException, RemoteException; }(3)bean 類(lèi) public class HelloWorldBean implements SessionBean { // SessionBean 中的方法 public void setSessionContext(SessionContext sessionContext) /**調用次方法會(huì )話(huà)結束*/ public void ejbRemove() //ejb通過(guò)待命和活動(dòng)的機制,管理一組正在工作的有狀態(tài)會(huì )話(huà)bean實(shí)例 /**活動(dòng)*/ public void ejbActivate() /**待命*/ public void ejbPassivate() // bean類(lèi) // 每個(gè)home 的create 方法對應一個(gè)ejbCreate()方法 // 有會(huì )話(huà)狀態(tài)有很多不同版本的create()方法。而create 方法必須有ejbCreate()方法與之一一對應 public void ejbCreate() } 不要在ejb類(lèi)中類(lèi)中實(shí)現遠程接口3. EJB 配置描述器(1)ejb-jar.xml (注釋) HelloWorld(ejbname) com.dhc.helloworld.HelloWorldHome(本地接口類(lèi)) com.dhc.helloworld.HelloWorld(遠程接口類(lèi)) com.dhc.helloworld.HelloWorldBean(bean類(lèi)) Stateless(無(wú)狀態(tài)會(huì )話(huà)) Bean(bean管理的事務(wù)) ShoppingCartEjb *(說(shuō)明ShoppingCartEjb的默認事務(wù)屬性指定為Required) Required(容器管理的事務(wù)使用的屬性 Nerver、NotSupported 、Supports、Mandatory、Required、RequiredNew) (2)weblogic-ejb-jar.xml (注釋) HelloWorld(ejb名稱(chēng)) HelloWorldEJB(jndi名稱(chēng)) 10(限制不會(huì )有超過(guò)10個(gè)無(wú)狀態(tài)會(huì )話(huà)bean并發(fā)運行) 10(放到內存緩存中的有狀態(tài)會(huì )話(huà)bean的最大數量) 4 . 建立ejb 檔案文件com/dhc/helloworld/(package)com/dhc/helloworld/HelloWorld(遠程接口)com/dhc/helloworld/HelloWorldHome(本地接口)com/dhc/helloworld/HelloWorldBean(bean類(lèi))META-INFMETA-INF/ejb-jar.xml(配置描述器)META-INF/weblogic-ejb-jar.xml(weblogic服務(wù)器配置描述器)說(shuō)明: META-INF 必須為大寫(xiě)5 . 容器管理的事務(wù)Nerver : 不參與事務(wù),如果參與產(chǎn)生RemoteExceptionNotSupported: 不能參與Supports: 如果調用者正在參與事務(wù),相應的EJB調用也可以參與事務(wù),否則不能Mandatory 如果調用者有一個(gè)事務(wù),相應的EJB可以參與事務(wù),否則,TransactionRequiredExceptionRequired 如果調用者有一個(gè)事務(wù),相應的EJB可以參與事務(wù),否則,容器將在調用相應的EJB之前,開(kāi)始一個(gè)事務(wù). 當方法調用完成以后,即提交該事務(wù).RequiresNew 在調用相應的EJB之前,開(kāi)始一個(gè)新的事務(wù),當方法調用返回時(shí),即提交這個(gè)事務(wù).6、ejb 引用在ejb-jar.xml an EJB reference to the Widget EJB(描述) ejb/WidgetEJB session com.dhc.WidgetHome com.dhc.Widget在 weblogic-ejb-jar.xml ejb/WidgeEJB DeployedWidge程序Content ctx = new InitialContent();Object h = ctx.lookup("java:/comp/env/ejb"); //環(huán)境變量是只讀的,而且是當前ejb的本地變量.WidgetHome home = (WidgetHome)PortableRemoteObject.narrow(h,WidgeHome.class);7. 資源管理器的引用定義資源管理的引用例子: 建立 jdbc、DBPool與JDBC數據源的映射在ejb-jar.xml (描述) jdbc/BDPool javax.sql.DataSource Container在 weblogic-ejb-jar.xml jdbc/DBPool DBPoolconfig.xml引用的優(yōu)點(diǎn)我們用大量的映射和配置,才建立了資源管理器的引用,但是還是很值得的。以為便于部署人員重新配置應用而不需要修改實(shí)際的bean類(lèi)代碼。甚至也不需要修改ejb的配置描述器java bean 代碼Content ctx = new InitialContent();DataSource dataSource = (DataSource)ctx.lookup("java:/comp/env/jdbc/DBPool");8 . 句柄: 作為一個(gè)串行化的對象,句柄中封裝了足夠的信息,以便重建對EJBObject的引用。句柄可用于在兩個(gè)相互合作的進(jìn)程中傳遞EJBObject的引用。接受進(jìn)程即可從句柄中取得EJBObject的引用。為了取得句柄,可以調用EJBObject接口的getHandle()方法,返回一個(gè)Handle實(shí)例為了重建EJBObject 引用??梢允褂肏andle 接口的getEJBObject()方法。例子: HelloWorld hw = home.create(); javax.ejb.Handle handle = hw.getHandle(); HelloWorld helloworld = (HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class); HomeHandle: 類(lèi)似handle ,但不能用于引用EJBObject HomeHandle 包含足夠的信息,可以重建EJBHome()的引用。 差異: 是調用 getHomeHandle()方法 和getEJBHome()方法 例子片斷: Content ctx = new InitialContext(); Object h = ctx.lookup("HelloWorldEJB"); HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class); HomeHandle homehandle = home.getHomeHandle(); Object nh = homehandle.getEJBHome(); HelloWorldHome newHomeReference = (HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class); 優(yōu)點(diǎn): 他們可以自動(dòng)的存儲重建引用所需的信息9.使用事務(wù)的技巧:(1) 一個(gè)事務(wù)不要涉及太多的操作.(2) 容器管理和bean管理的事務(wù) 事務(wù)既耗費應用服務(wù)器中的資源,又耗費數據庫資源,所以事務(wù)越短越好. 盡量使用容器管理事務(wù)而不要采用bean管理事務(wù)的方式.(3) ejb遇到錯誤,需要強制事務(wù)回滾. 使用EJBObject.setRollbackOnly();(4) 不能讓事務(wù)涉及web層和表示邏輯(5) 企業(yè)應用中不應當選用supports 事務(wù)屬性,因為只有調用者開(kāi)始一個(gè)事務(wù)后,ejb才能在事務(wù)中運行.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。