我有一个小问题...... 我在访问仅在bean的远程接口中声明的方法而不是在本地接口中的方法之间搜索本地访问的差异...
接口声明(远程或本地)是否确定了方法的访问协议?或者ejb容器是否理解两个bean都在运行相同的JVM? 有很大的性能差异吗? 你对此有任何消息来源吗?
BR的
Laurent
答案 0 :(得分:2)
我建议您在EJB容器上测试它以确保。
那就是说,根据规范(here,第3.2.3节)@Remote接口必须使用by-value参数传递,而@Local则假定by-reference参数传递。
这意味着即使客户端和@Remote bean都在同一个JVM上,也会产生参数复制的开销。
这也意味着所有@Remote参数都必须是可序列化的。
答案 1 :(得分:1)
是的,你是对的,@ Remote总是比@Local慢,因为它总是有更多的工作要做。
将bean的接口公开为@Local和@Remote(以及规范说它很少见的原因)的问题是参数和返回值语义不清楚。例如,如果您有方法:
List filter(List arg);
...如果bean通过修改参数来实现此方法,那么客户端必须非常小心,以确保在调用方法(@Local)之前复制对象,或者避免浪费地复制对象(如果它将是自动完成(@Remote)。此外,bean必须小心,不要从@Local接口向其调用者分发可变状态。虽然List的情况可能很清楚,但对于像java.util.Date这样可疑的Serializable或者bean想要返回一个“常量”数组可能不太清楚。
答案 2 :(得分:0)
因此,如果我创建一个没有本地接口的bean,那么同一个ejb容器中的任何bean都会因为这个开销而变慢? 因此,如果本地访问将是本地访问,那么最好总是声明一个本地接口,即使这个本地接口“只是”远程副本也是如此。
我是对的吗?
这很奇怪,因为在你提到的源代码中(JSR 220:Enterprise JavaBeansTM,Version 3.0 EJB核心合同和要求) “虽然可以为企业bean提供远程客户端视图和本地客户端视图,但通常只提供一个或另一个。”
答案 3 :(得分:0)
我在自己的电脑上尝试了两个接口(一个是本地另一个接口),声明了相同的方法。
包计算; import javax.ejb.Remote;
@Remote public interface CalculatorRemote {
public int add(int a, int b);
public int sub(int a, int b);
}
在另一个bean中,我注入了两个接口并使用它们:
@EJB
public CalculatorRemote myRemoteCalc;
@EJB
public CalculatorLocal myLocalCalc;
public String fastest(int iter){
myRemoteCalc.add(5,6);
myLocalCalc.add(5,6);
long inittimeLocal=System.currentTimeMillis();
for(int j = 0; j<iter; j++){
myLocalCalc.sub(28, 26);
myLocalCalc.add(134778, 1234);
}
long LocalTime=System.currentTimeMillis()-inittimeLocal;
long inittimeRemote=System.currentTimeMillis();
for(int i = 0; i<iter; i++){
myRemoteCalc.sub(28, 26);
myRemoteCalc.add(134778, 1234);
}
long RemoteTime=System.currentTimeMillis()-inittimeRemote;
if(LocalTime>RemoteTime){
return "Local slower than Remote " + (LocalTime-RemoteTime) + " ms difference with remote processing in "+ RemoteTime + "ms and local processing in"+ LocalTime + " ms. ";
}
return "Remote slower than Local " + (RemoteTime-LocalTime) + " ms difference with remote processing in "+ RemoteTime + "ms and local processing in"+ LocalTime + " ms. " ;
}
当我最快地调用方法时(用于确定哪个远程或本地调用最快),结果在每次两个访问方法之间的时间因子为5时。
这是输出:
它为200000次迭代提供了以下输出:
远程慢于本地46 015 ms与远程处理的差异在58 609 ms和本地处理在12 594 ms。
以及100000次迭代的以下输出: 远程慢于本地23 406 ms与远程处理的差异在29 609ms和本地处理在6 203 ms。
以及1000的以下输出
远程慢于本地219 ms与297ms远程处理和78 ms本地处理的差异。
很奇怪SUN几乎建议我们在他引用的部分末尾只使用Gregory源代码中的一种类型的界面: 虽然可以为企业bean提供远程客户端视图和本地客户端视图,但通常只提供一个或另一个。
在这种情况下,只有远程访问,呼叫将很慢,没有人会获得本地快速访问的优势。
我认为任何bean都应该有一个包含远程接口方法的本地接口。远程接口方法将是本地接口方法的子集。有了这个,我们确信远程客户端以正常方式提供服务,而本地服务器则以快速方式提供服务。
他们是否只是为了鼓励我们为内部和外部提供不同的bean?或者是因为在更复杂的方法中,本地和远程访问会有很大不同?