`

EJB 中的 call-by-reference

    博客分类:
  • EJB
 
阅读更多
在项目中看到后台报了这个警告。分析之。
原因是组件接口中的参数为Node类型,而Node不是序列化。
EJB远程调用要求参数必须序列化。但是EJB还可以本地调用,其前提条件就是调用者和被调用着必须在一个JVM中,也就是在一个应用中吧。
所以,weblogic检测到参数没有序列化,所以强制使用本地调用,即call-by-reference。

其实即使参数进行了序列化,我们自己也可以在weblogic-ejb-jar.xml中配置属性
<enable-call-by-reference>true</enable-call-by-reference>
来让服务器进行本地引用的调用,以此来提高性能,省去网络传输的消耗。
当然,前提是调用者和被调用着在一个jvm中。

throws java.rmi.RemoteException' in EJB 'DynamicValidationEJB' contains a parameter of type: 'org.dom4j.Node' which is not Serializable. Though the EJB 'DynamicValidationEJB' has call-by-reference set to false, this parameter is not Serializable and hence will be passed by reference. A parameter can be passed using call-by-value only if the parameter type is Serializable.>


以下是转载:

远程接口采用Call-by-value 是传值,传值就要对参数进行copy,所以要求参数必须是可序列化,性能也比较低。因此参数在ejb内部改变对外部对象没有影响。

本地接口采用Call-by-reference 是传引用,可以提高性能,不过这样作,有可能改变参数的值,此时的参数可以是非序列化的

如果采用本地接口就必须采用Call-by-reference,不是可以,是必须
如果采用远程接口,必须用Call-by-Value,但是调用关系完全在一个VM内的时候,WebLogic可以优化成Call-by-reference,这时后远程调用就自动退化为本地调用,性能上有提高。那个警告就是说你禁止了这个优化,可以不理。建议打开优化提升性能。

如果开发的应用将web和ejb部署成一个ear文件,那么ejb和ejb之间的调用,web和ejb之间的调用都是采用Call-By-Reference的方式,能大大提高效率。
如果你不采用这种方式,那么你使用的是remote的方式,无论处于一个JVM中,都是采用Call-By-Value的方式调用的。


1。可以使用call-by-reference的条件,必须在同一个application中。


2。call-by-reference的设置,在weblogic.xml中

<weblogic-enterprise-bean>
     <entity-descriptor>
          <ejb-name>testBean</ejb-name>
          ...
          <enable-call-by-reference>True</enable-call-by-reference>
     </entity-descriptor>
</weblogic-enterprise-bean>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics