﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-飞艳小屋-文章分类-EJB</title><link>http://www.blogjava.net/songfei/category/5990.html</link><description>欢迎艳儿的加入</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 15:48:57 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 15:48:57 GMT</pubDate><ttl>60</ttl><item><title>Weblogic EJB 学习笔记</title><link>http://www.blogjava.net/songfei/articles/23881.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 14 Dec 2005 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/23881.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/23881.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/23881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/23881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/23881.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD class=title1 align=middle width="100%" bgColor=#eeeeee colSpan=3 height=40><B>Weblogic&nbsp;EJB&nbsp;学习笔记</B></TD></TR>
<TR>
<TD align=middle width="100%" bgColor=#eeeeee><A href="http://www.javaresearch.org/profile.jsp?user=2120">littleboys</A> 原创&nbsp; (参与分：47498，专家分：330)&nbsp;&nbsp; 发表：2003-06-18 11:16 &nbsp;&nbsp;版本：1.0 &nbsp;&nbsp;阅读：<B>12529</B>次 </TD></TR></TBODY></TABLE></TD></TR><!-- end of article title -->
<TR>
<TD vAlign=top align=middle width="100%"><!--start of article content -->
<TABLE width="98%" border=0>
<TBODY>
<TR>
<TD class=text align=left width="100%"><BR><B>EJB&nbsp;学习笔记</B><BR>1、ejb&nbsp;基础知识<BR>（1）&nbsp;无状态会话bean<BR>&nbsp;&nbsp;&nbsp;&nbsp;不保存客户机的会话状态<BR>&nbsp;&nbsp;&nbsp;&nbsp;优点：使用小量的实例即可满足大量的客户。每个实例都没有标识，相互之间是等价的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;等?的无状态会话bean：&nbsp;&nbsp;多次和一次调用的结果和效应相同。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在集群中可以负载均衡&nbsp;a&nbsp;机器失败，可以在b机器上重试<BR>&nbsp;&nbsp;&nbsp;&nbsp;非等?的无状态会话bean：&nbsp;如：计数器<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不能自动因故障而进行切换。<BR>（2）&nbsp;有状态会话bean<BR>&nbsp;&nbsp;&nbsp;&nbsp;保存客户机的会话状态<BR>&nbsp;&nbsp;&nbsp;&nbsp;特点：&nbsp;在有会话状态会话的bean例子中，出纳员的数量等于活动的顾客的数量，这可以简化编程模式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weblogic&nbsp;通过内存复制技术&nbsp;在集群中进行负载均衡<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内存复制技术：&nbsp;每个有会话状态的bean实例都将存储在两个服务器的内存中，一个服务器作为主服务器，另一个作为辅助服务器。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果主失败，辅助变为主，然后自动选择别的可用的服务器作为辅助。<BR>&nbsp;&nbsp;&nbsp;&nbsp;遗憾：&nbsp;很难在servlet&nbsp;和jsp中用好有状态会话bean。可能会发生并发现象，产生RemoteException<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weblogic&nbsp;的&lt;allow-concurrent-calls&gt;&nbsp;可以封锁任何并发的调用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;同步：&nbsp;可以有选择地实现&nbsp;javax.ejb.SessionSynchronization接口<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afeterBegin()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//进入事务时<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beforeCompletion()&nbsp;&nbsp;&nbsp;&nbsp;//提交事务前,用于提交前把缓存的数据写到数据库中.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterCompletion()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//提交事务后,用于释放共享资源或者更新事务提交和终止方面的统计信息.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;会话bean通过其&nbsp;SessionContext&nbsp;对象中的&nbsp;getUserTransaction()&nbsp;方法,取得对UserTransaction的应用<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通常&nbsp;SessionContext&nbsp;被存放在成员变量中<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**&nbsp;记住是在调用ejb.create()方法前调用&nbsp;setUserTransaction()&nbsp;方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用对&nbsp;UserTransaction&nbsp;的引用会话可以使用&nbsp;begin()&nbsp;、commit()、rollback()&nbsp;方法界定一个事务.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>（3）&nbsp;实体&nbsp;bean：&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;它有一个主健作为唯一的标识符<BR>&nbsp;&nbsp;&nbsp;&nbsp;组成部分:&nbsp;由本地接口、远程接口、bean类、主健类和配置描述器组成。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本地接口：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;扩展了javax.ejb.EJBHome接口，包括create（）、remove（）、finder&nbsp;和home等方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)create（）方法调用bean类中的ejbCreate（）方法。相当于数据的insert&nbsp;方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)remove（）方法相当于数据库的delete操作。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)finder（）方法，使客户能够查询和接收满足查询条件的实体bean的引用。每个实体bean的本地接口中都必须<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有一个findByPrimaryKey()&nbsp;方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)home&nbsp;方法，类似于无状态会话bean。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主健类：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实体bean必须包括一个主健类，主健类用于标识实体bean实例，而且实体bean数据类型必须是唯一的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主健类可以是java的基本类型String&nbsp;Integer&nbsp;也可以是用户自定义的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也可以是多个字段的主健的复合主健。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;类和bean的上下文环境：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现javax.ejb.EJBObject&nbsp;接口,其中包含业务方法的语法格式定义.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;类实现了javax.ejb.EntityBean接口,同javax.ejb.SessionBean接口一样,EntityBean&nbsp;接口包含了EJB<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器调用bean实例的语法格式.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在bean的构造器执行之后,立即调用setEntityContext()&nbsp;方法,同时把bean实例的EntityContext&nbsp;传递给它.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean类实现了home方法和远程接口中的业务方法,home方法是针对匿名实例的方法不应使用有关的主健值.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;分为：<BR>&nbsp;&nbsp;&nbsp;&nbsp;容器管理持久性（Container－Managerd&nbsp;Persistence）CMP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;特点：&nbsp;EJB&nbsp;容器自动生成，用于把实体bean的数据写入到数据库中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优点：&nbsp;bean作者可以避免编写实体bean与关系数据库数据访问方面的代码。cmp将自动处理这一过程。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个性:&nbsp;&nbsp;每一个cmp&nbsp;实体bean&nbsp;都有一组容器管理的字段,这些字段存储在数据库,并可从中加载.通常,每个容器管理的字段都对应于<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关系数据库中的一个列.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器管理的每个字段必须在ejb-jar.xml中定义,这使容器能够把容器管理的字段与bean类中的set和get方法进行匹配比较.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外,bean作者可以增加另外一个cmp配置描述文件&nbsp;weblogic-cmp-rdbms.xml,其中包含数据库表名和每个容器管理的字<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;段和相应的数据列的映射.<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;bean管理持久性（Bean－Managerd&nbsp;Persistence&nbsp;）&nbsp;BMP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;特点：&nbsp;在bmp实体中，bean作者需要自己编写数据库访问代码，也就是编写JDBC代码，插入、删除和查询数据库中的实体bean数据。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优点：&nbsp;可以让bean的作者完全灵活的处理实体bean的持久性数据，因为作者需要写数据访问的代码，他几乎可以使用任何持久性存<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;储方式ejb2.0&nbsp;cmp提供实体bean之间的标准关系映射，使容器能自动管理业务对象之间的交互。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp拥有更多的访问控制，因此cmp比bmp有较好的性能。<BR><BR>（4）&nbsp;消息&nbsp;bean<BR>&nbsp;&nbsp;&nbsp;&nbsp;把JMS&nbsp;和EJB&nbsp;成功结合在一起，集成的结果<BR>&nbsp;&nbsp;&nbsp;&nbsp;特点：客户机不需要调用消息bean&nbsp;相反：&nbsp;客户机只需要发一个消息给jMS目的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;在消息到达以后，消息bean的onmessage（）方法将被调用，以处理这个消息。<BR>&nbsp;&nbsp;&nbsp;&nbsp;消息bean用于在服务器中执行异步操作。<BR><BR>2。EJB&nbsp;组成<BR>（1）远程接口<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;interface&nbsp;HelloWord&nbsp;extents&nbsp;EJBObject<BR>&nbsp;&nbsp;&nbsp;&nbsp;｛<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EJBObject&nbsp;接口方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJBHome&nbsp;getEJBHome()&nbsp;throws&nbsp;RemoteException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;getPrimaryKey()&nbsp;throws&nbsp;RemoteException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;remove()&nbsp;throws&nbsp;RemoteException,&nbsp;RemoveException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Handle&nbsp;getHandle()&nbsp;throws&nbsp;RemoteException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;isIdentical(EJBObject&nbsp;ejbObject)&nbsp;throws&nbsp;RemoteException;<BR>&nbsp;&nbsp;&nbsp;&nbsp;｝<BR>（2）本地接口<BR>&nbsp;&nbsp;&nbsp;&nbsp;本地接口是ejb工厂，客户机可以使用本地接口创建、找出和删除ejb实例。只需写本地接口中的方法的语法调用格式<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;HelloWorldHome&nbsp;extends&nbsp;EJBHome<BR>&nbsp;&nbsp;&nbsp;&nbsp;｛<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EJBHome&nbsp;接口方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;remove(Handle&nbsp;handle)&nbsp;throws&nbsp;RemoteException,&nbsp;RemoveException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;remove(Object&nbsp;o)&nbsp;throws&nbsp;RemoteException,&nbsp;RemoveException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJBMetaData&nbsp;getEJBMetaData()&nbsp;throws&nbsp;RemoteException;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HomeHandle&nbsp;getHomeHandle()&nbsp;throws&nbsp;RemoteException;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Home<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;HelloWorld&nbsp;create()&nbsp;throws&nbsp;CreateException,&nbsp;RemoteException;<BR>&nbsp;&nbsp;&nbsp;&nbsp;｝<BR><BR>（3）bean&nbsp;类<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;HelloWorldBean&nbsp;implements&nbsp;SessionBean<BR>&nbsp;&nbsp;&nbsp;&nbsp;｛<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SessionBean&nbsp;中的方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSessionContext(SessionContext&nbsp;sessionContext)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**调用次方法会话结束*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;ejbRemove()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ejb通过待命和活动的机制，管理一组正在工作的有状态会话bean实例<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**活动*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;ejbActivate()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**待命*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;ejbPassivate()&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;bean类<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;每个home&nbsp;的create&nbsp;方法对应一个ejbCreate（）方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;有会话状态有很多不同版本的create（）方法。而create&nbsp;方法必须有ejbCreate（）方法与之一一对应<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;ejbCreate()<BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;｝<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;不要在ejb类中类中实现远程接口<BR>3.&nbsp;EJB&nbsp;配置描述器<BR>（1）ejb－jar.xml<BR>&lt;ejb-jar&gt;&nbsp;(注释)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;enterprise-beans&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;session&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-name&gt;HelloWorld（ejbname）&lt;/ejb-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;home&gt;com.dhc.helloworld.HelloWorldHome（本地接口类）&lt;/home&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;remote&gt;com.dhc.helloworld.HelloWorld（远程接口类）&lt;/remote&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-class&gt;com.dhc.helloworld.HelloWorldBean（bean类）&lt;/ejb-class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;session-type&gt;Stateless（无状态会话）&lt;/session-type&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;transaction-type&gt;Bean（bean管理的事务）&lt;/transaction-type&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/session&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/enterprise-beans&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;container-transaction&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;method&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-name&gt;ShoppingCartEjb&lt;/ejb-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;method-name&gt;*（说明ShoppingCartEjb的默认事务属性指定为Required）&lt;/method-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/method&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;trans-attribute&gt;Required（容器管理的事务使用的属性&nbsp;Nerver、NotSupported<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;、Supports、Mandatory、Required、RequiredNew）&lt;/trans-attribute&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/container-transaction&gt;<BR>&lt;/ejb-jar&gt;<BR>（2）weblogic-ejb-jar.xml&nbsp;(注释)<BR>&lt;weblogic-ejb-jar&gt;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;weblogic-enterprise-bean&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-name&gt;HelloWorld（ejb名称）&lt;/ejb-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jndi-name&gt;HelloWorldEJB（jndi名称）&lt;/jndi-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;max-bean-in-freepool&gt;10（限制不会有超过10个无状态会话bean并发运行）&lt;/max-bean-in-freepool&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;max-bean-in-cache&gt;10（放到内存缓存中的有状态会话bean的最大数量）&lt;/max-bean-in-cache&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/weblogic-enterprise-bean&gt;<BR>&lt;/weblogic-ejb-jar&gt;&nbsp;&nbsp;<BR><BR>4&nbsp;.&nbsp;建立ejb&nbsp;档案文件<BR>com/dhc/helloworld/（package）<BR>com/dhc/helloworld/HelloWorld（远程接口）<BR>com/dhc/helloworld/HelloWorldHome（本地接口）<BR>com/dhc/helloworld/HelloWorldBean（bean类）<BR>META-INF<BR>META-INF/ejb－jar.xml（配置描述器）<BR>META-INF/weblogic-ejb-jar.xml（weblogic服务器配置描述器）<BR><BR>说明：&nbsp;META-INF&nbsp;必须为大写<BR><BR>5&nbsp;.&nbsp;容器管理的事务<BR>Nerver&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不参与事务,如果参与产生RemoteException<BR>NotSupported:&nbsp;&nbsp;&nbsp;不能参与<BR>Supports:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果调用者正在参与事务,相应的EJB调用也可以参与事务,否则不能<BR>Mandatory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果调用者有一个事务,相应的EJB可以参与事务,否则,TransactionRequiredException<BR>Required&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果调用者有一个事务,相应的EJB可以参与事务,否则,容器将在调用相应的EJB之前,开始一个事务.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当方法调用完成以后,即提交该事务.<BR>RequiresNew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在调用相应的EJB之前,开始一个新的事务,当方法调用返回时,即提交这个事务.<BR><BR><BR>6、ejb&nbsp;引用<BR><BR>在ejb－jar.xml<BR>&lt;ejb-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;&nbsp;an&nbsp;EJB&nbsp;reference&nbsp;to&nbsp;the&nbsp;Widget&nbsp;EJB(描述)&lt;/description&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;ejb/WidgetEJB&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-ref-type&gt;session&lt;/ejb-ref-type&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;home&gt;com.dhc.WidgetHome&lt;/home&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;remote&gt;com.dhc.Widget&lt;/remote&gt;<BR>&lt;/ejb-ref&gt;<BR><BR>在&nbsp;weblogic-ejb-jar.xml&nbsp;<BR>&lt;ejb-reference-description&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ejb-ref-name&gt;ejb/WidgeEJB&lt;/ejb-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;jndi-name&gt;DeployedWidge&lt;/jndi-name&gt;<BR>&lt;/ejb-reference-description&gt;<BR><BR>程序<BR>Content&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContent();<BR>Object&nbsp;h&nbsp;=&nbsp;ctx.lookup("java:/comp/env/ejb");&nbsp;&nbsp;&nbsp;&nbsp;//环境变量是只读的,而且是当前ejb的本地变量.<BR>WidgetHome&nbsp;home&nbsp;=&nbsp;(WidgetHome)PortableRemoteObject.narrow(h,WidgeHome.class);<BR><BR>7.&nbsp;资源管理器的引用<BR>定义资源管理的引用<BR>例子：&nbsp;建立&nbsp;jdbc、DBPool与JDBC数据源的映射<BR>在ejb－jar.xml<BR>&lt;resource-ref&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;description&gt;(描述)&lt;/description&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-ref-name&gt;jdbc/BDPool&lt;/res-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-auth&gt;Container&lt;/res-auth&gt;<BR>&lt;/resource-ref&gt;<BR><BR>在&nbsp;weblogic-ejb-jar.xml&nbsp;<BR>&lt;resource-description&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;res-ref-name&gt;jdbc/DBPool&lt;/res-ref-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;jndi-name&gt;DBPool&lt;/jndi-name&gt;<BR>&lt;/resource-description&gt;<BR><BR>config.xml<BR><BR>&lt;JDBCTxDataSource&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;name="DBPool"<BR>&nbsp;&nbsp;&nbsp;&nbsp;Targets="myserver"<BR>&nbsp;&nbsp;&nbsp;&nbsp;JDDIName="DBPool"&nbsp;(jndi名称)<BR>&nbsp;&nbsp;&nbsp;&nbsp;PoolName&nbsp;="DevelopmentPool"<BR>/&gt;<BR><BR>引用的优点<BR>我们用大量的映射和配置，才建立了资源管理器的引用，但是还是很值得的。<BR>以为便于部署人员重新配置应用而不需要修改实际的bean类代码。甚至也不需要修改ejb的配置描述器<BR>java&nbsp;bean&nbsp;代码<BR><BR>Content&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContent();<BR>DataSource&nbsp;dataSource&nbsp;=&nbsp;(DataSource)ctx.lookup("java:/comp/env/jdbc/DBPool");<BR><BR>8&nbsp;.&nbsp;句柄：&nbsp;作为一个串行化的对象，句柄中封装了足够的信息，以便重建对EJBObject的引用。<BR>句柄可用于在两个相互合作的进程中传递EJBObject的引用。接受进程即可从句柄中取得EJBObject的引用。<BR><BR>为了取得句柄，可以调用EJBObject接口的getHandle（）方法，返回一个Handle实例<BR>为了重建EJBObject&nbsp;引用。可以使用Handle&nbsp;接口的getEJBObject（）方法。<BR><BR>例子：<BR>&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;hw&nbsp;=&nbsp;home.create();<BR>&nbsp;&nbsp;&nbsp;&nbsp;javax.ejb.Handle&nbsp;handle&nbsp;=&nbsp;hw.getHandle();<BR>&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;helloworld&nbsp;=&nbsp;(HelloWorld)PortableRemoteObject.narrow(handle.getEJBObject(),HelloWorld.class);<BR><BR>&nbsp;<BR>&nbsp;HomeHandle:<BR>&nbsp;&nbsp;&nbsp;&nbsp;类似handle&nbsp;，但不能用于引用EJBObject<BR>&nbsp;&nbsp;&nbsp;&nbsp;HomeHandle&nbsp;包含足够的信息，可以重建EJBHome（）的引用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;差异：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是调用&nbsp;getHomeHandle（）方法&nbsp;和getEJBHome（）方法<BR>&nbsp;例子片断：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Content&nbsp;ctx&nbsp;＝&nbsp;new&nbsp;InitialContext();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;h&nbsp;=&nbsp;ctx.lookup("HelloWorldEJB");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldHome&nbsp;home&nbsp;=&nbsp;(HelloWorldHome)PortableRemoteObject.narrow(h,HelloWorldHome.class);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HomeHandle&nbsp;homehandle&nbsp;=&nbsp;home.getHomeHandle();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;nh&nbsp;=&nbsp;homehandle.getEJBHome();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorldHome&nbsp;newHomeReference&nbsp;=&nbsp;(HelloWorldHome)PortableRemoteObject.narrow(nh,HelloWorldHome.class);<BR><BR>&nbsp;优点:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他们可以自动的存储重建引用所需的信息<BR><BR>9.使用事务的技巧:<BR>(1)&nbsp;一个事务不要涉及太多的操作.<BR>(2)&nbsp;容器管理和bean管理的事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;事务既耗费应用服务器中的资源,又耗费数据库资源,所以事务越短越好.<BR>&nbsp;&nbsp;&nbsp;&nbsp;尽量使用容器管理事务而不要采用bean管理事务的方式.<BR>(3)&nbsp;ejb遇到错误,需要强制事务回滚.&nbsp;使用EJBObject.setRollbackOnly();<BR>(4)&nbsp;不能让事务涉及web层和表示逻辑<BR>(5)&nbsp;企业应用中不应当选用supports&nbsp;事务属性,因为只有调用者开始一个事务后,ejb才能在事务中运行. </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>基于weblogic&nbsp;的ejb&nbsp;学习笔记（二）<BR><BR>编辑实体bean的高级课程<BR>1.&nbsp;怎样开发主健类<BR>ejb的主健类主要用做持久存储和ejb容器中的唯一标识符.<BR>通常主健类的字段直接映射到数据库中的主健字段.<BR>如果主健只是由单个实体bean字段组成.且其数据类型是基本的java类.如string,则bean作者不必开发自定义的主健类.<BR>只需要在配置描述器中指定类的名字和主健字段即可<BR><BR>如果把主健映射到一个用户定义的类型,或者映射到多个字段,则bean的作者必须写出自定义的主健类.<BR><BR>主健类必须实现&nbsp;java.io.serializable,而且包含主健字段.<BR><BR>对于cmp,字段名必须匹配实体bean中的相应的主健字段名,这将使ejb容器能够把适当的cmp字段赋值到主健类中的相应字段中.<BR><BR>2.&nbsp;实现hashcode()方法<BR>hashcode()&nbsp;方法的实现原理是,利用主健字段,经适的处理后,生成并返回一个整数.&nbsp;这个生成的整数称为散列码,用作表格的索引.<BR>对于一个给定的主健,hashcode()方法的返回值应当总是一样的.&nbsp;常见做法:&nbsp;执行"异或"&nbsp;操作.<BR><BR>3.&nbsp;实现&nbsp;equals()&nbsp;方法<BR>&nbsp;正确地实现equals()方法也需要一定的技巧.&nbsp;任何equals()&nbsp;方法的第一行都应当检查传递进来的引用是否是"this",&nbsp;检查equals()<BR>&nbsp;方法是否是针对自己的调用.&nbsp;通常做法:&nbsp;当容器有一个主健对象时,她要检查这个主健对象是否已经存在于数据结构中.<BR><BR>&nbsp;接着,equals()&nbsp;方法需要检查传递进来的主健类的类型.&nbsp;如果主健类是中继类(final),可以使用instanceof&nbsp;进行简单的检查.<BR>&nbsp;否则,传递进来的参数也许是主健类的子类.在这种情况下,equals()&nbsp;方法必须使用getClass.equals,&nbsp;以确保类的类型是匹配的<BR><BR>&nbsp;建议主健类采用终极类.&nbsp;(instanceof&nbsp;效率要高一些)<BR><BR>&nbsp;最后,equals()&nbsp;方法需要需要比较传递进来的对象的所有值.&nbsp;如果所有值是相同的,说明对象也是相同的<BR>&nbsp;注意:&nbsp;要先比较散列码.<BR><BR>&nbsp;4&nbsp;实体bean的继承和异构<BR>&nbsp;&nbsp;&nbsp;实体bean&nbsp;可以利用java的继承和异构的特性.<BR><BR>5.&nbsp;继承的限制<BR>尽管ejb&nbsp;规范允许组件之间的继承,但夜游一些细微的规则限制了怎样设计和实现一个继承的ejb.<BR>&nbsp;ejb的规则要求,本地接口的create()&nbsp;方法返回的远程接口不能是一个子类,也不能是超类.&nbsp;实体bean&nbsp;的ejbreate()&nbsp;方法也<BR>&nbsp;必须返回主健类型,也不能是一个子类,也不能是超类.<BR>类似的findByPrimaryKey()方法必须使用主健类型作为参数返回远程接口.<BR>这些要求限制了bean作者对继承的实现.<BR><BR>6.&nbsp;继承和异构的设计模式<BR><BR>注意:&nbsp;具有继承和异构特性的实体bean,很重要一点就是要确定一般情况下究竟都需要使用哪一些属性.<BR><BR>7&nbsp;.&nbsp;接口的继承<BR><BR>通过bean类的继承性,bean作者只需要在一个地方实现业务方法,其它实体bean就可以共享类中的方法了.<BR><BR>8&nbsp;使用多个bean类<BR>&nbsp;&nbsp;为本地和远程接口创建一个基本接口,不是达到异构共享的唯一方法.&nbsp;另一个常见的做法是<BR>&nbsp;&nbsp;使用等同的本地和远程接口,但采用不同的bean类实现其中的业务方法.<BR>&nbsp;&nbsp;这种做法类似于使用一个具有若干不同实现的接口.&nbsp;<BR>&nbsp;&nbsp;好处:&nbsp;客户不知道或根本不管正在使用哪一种实现,客户机只对接口进行操作.<BR><BR>9.&nbsp;实体bean&nbsp;与锁<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;实体bean&nbsp;不是可重入的或多线程的组件，每个实体bean实例也没有多线程控制的能力。<BR>一次实体bean&nbsp;类中的方法也不是同步化的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;实体bean实例不能是多线程的，所以ejb容器必须串行地执行所有的容器方法和业务方法。<BR>这意味着当业务方法正在执行时，ejb容器不能再调用其它方法，比如&nbsp;ejbPassivate（）方法。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;并发控制：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一种做法是对每一个事务都激活实体bean实例。同过数据库的访问锁的方式进行并发处理。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一种方法是，每一个主健只保持一个实体bean实例，这样一次只有一个事务可以访问实体bean。一旦<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前一个事务提交或回滚，才允许另一个事务使用这个实体bean实例。<BR>&nbsp;&nbsp;&nbsp;&nbsp;并发控制策略：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库并发控制：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;除非特别情况，应尽量使用默认的数据库并发控制。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;排它性并发控制：<BR><img src ="http://www.blogjava.net/songfei/aggbug/23881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2005-12-14 15:33 <a href="http://www.blogjava.net/songfei/articles/23881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>