EJB 中的 call-by-reference

在项目中看到后台报了这个警告。分析之。
原因是组件接口中的参数为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内的时候,[color=red]WebLogic可以优化成Call-by-reference,这时后远程调用就自动退化为本地调用[/color],性能上有提高。那个警告就是说你禁止了这个优化,可以不理。建议打开优化提升性能。

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

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


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

<weblogic-enterprise-bean>
<entity-descriptor>
<ejb-name>testBean</ejb-name>
...
[color=red]<enable-call-by-reference>True</enable-call-by-reference>[/color]
</entity-descriptor>
</weblogic-enterprise-bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值