我有一个小问题...我搜索访问是仅在bean的远程接口,而不是在本地接口声明的方法与在本地接入的区别...
不接口声明(远程或本地)确定该方法的接入协议? 或者没有EJB容器明白无论豆运行在同一个JVM? 是有一个很大的性能差异? 你对此有任何来源?
BR的
洛朗
我有一个小问题...我搜索访问是仅在bean的远程接口,而不是在本地接口声明的方法与在本地接入的区别...
不接口声明(远程或本地)确定该方法的接入协议? 或者没有EJB容器明白无论豆运行在同一个JVM? 是有一个很大的性能差异? 你对此有任何来源?
BR的
洛朗
我建议测试它的EJB容器上是肯定的。
这就是说,根据规范( 这里 ,第3.2.3节)@Remote接口必须使用由值参数传递,而@Local假定通过参考参数的传递。
这意味着,即使客户端和@Remote豆都在同一个JVM有参数复制的开销。
这也意味着,所有@Remote参数必须是可序列化。
是的,你是正确的,@Remote总是比@Local慢,因为它总是有更多的工作要做。
与暴露bean的接口都@Local和@Remote(和规范说,这是罕见的原因)的问题是,参数和返回值语义是不清楚。 例如,如果你有一个方法:
List filter(List arg);
...如果这个bean通过修改参数实现此方法,那么客户必须非常小心,以确保要么调用方法(@Local)之前复制的对象或避免浪费复制的对象,如果它会自动完成( @远程)。 此外,bean必须要小心,不要来伸手,可变状态从@Local接口的调用者。 虽然情况可能明确为列表,它可能是有问题的Serializables像java.util.Date或者如果bean要返回“常数”阵列不太清楚。
所以,如果我没有创建本地接口的bean,同EJB容器内的任何bean将被由高架slowered? 因此,最好是始终声明一个本地接口是否会有即使这个本地接口“只是”一个遥控器一个副本的本地访问。
我对吗?
因为在源你提到很奇怪(JSR 220:企业JavaBeansTM,版本3.0 EJB核心合同和需求)“虽然有可能同时提供一个远程客户视图和一个enterprise bean的本地客户端视图,更通常只有一个或另将提供“。
我想在我自己的电脑,两个接口(一个本地的其他远程)用同样的方法声明。
包计算值; 进口javax.ejb.Remote;
@Remote公共接口CalculatorRemote {
public int add(int a, int b);
public int sub(int a, int b);
}
在另一个豆我注入这两个接口,并使用它们:
@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次迭代:
比远程处理在58 609毫秒12毫秒594本地46 015毫秒差和本地处理远程慢。
和以下的输出为10万次迭代:比在6 203毫秒与29个609ms远程处理和局部处理本地23 406毫秒差远程慢。
和以下的输出为1000
比297ms与远程处理本地219毫秒的差异和就地加工in78毫秒远程慢。
这是相当奇怪的是,SUN近建议我们在本节结束时,他指的是只使用一种类型的接口格雷戈里来源: 虽然可以同时提供远程客户视图和一个enterprise bean的本地客户端视图,更典型地仅一个或另一个将被提供。
在这种情况下,只有远程接入,呼叫将是缓慢的,并没有人会得到当地的快速存取的优势。
我认为任何豆应该有一个本地接口,其中包括远程接口的方法。 远程接口的方法将是本地接口方法的一个子集。 与此,我们相信,远程客户端是在一个正常的方式提供服务,而本地的是在一个快速的方式提供服务。
难道他们告诉只是鼓励我们要为内部和外部的东西提供不同的豆类? 还是因为在更复杂的方法本地和远程访问会有很大的不同?