EJB3 - 另一个bean接口的会话Bean调用方法(EJB3 - Session Bean c

2019-09-20 22:48发布

我有一个小问题...我搜索访问是仅在bean的远程接口,而不是在本地接口声明的方法与在本地接入的区别...

不接口声明(远程或本地)确定该方法的接入协议? 或者没有EJB容器明白无论豆运行在同一个JVM? 是有一个很大的性能差异? 你对此有任何来源?

BR的

洛朗

Answer 1:

我建议测试它的EJB容器上是肯定的。

这就是说,根据规范( 这里 ,第3.2.3节)@Remote接口必须使用由值参数传递,而@Local假定通过参考参数的传递。

这意味着,即使客户端和@Remote豆都在同一个JVM有参数复制的开销。

这也意味着,所有@Remote参数必须是可序列化。



Answer 2:

是的,你是正确的,@Remote总是比@Local慢,因为它总是有更多的工作要做。

与暴露bean的接口都@Local和@Remote(和规范说,这是罕见的原因)的问题是,参数和返回值语义是不清楚。 例如,如果你有一个方法:

List filter(List arg);

...如果这个bean通过修改参数实现此方法,那么客户必须非常小心,以确保要么调用方法(@Local)之前复制的对象或避免浪费复制的对象,如果它会自动完成( @远程)。 此外,bean必须要小心,不要来伸手,可变状态从@Local接口的调用者。 虽然情况可能明确为列表,它可能是有问题的Serializables像java.util.Date或者如果bean要返回“常数”阵列不太清楚。



Answer 3:

所以,如果我没有创建本地接口的bean,同EJB容器内的任何bean将被由高架slowered? 因此,最好是始终声明一个本地接口是否会有即使这个本地接口“只是”一个遥控器一个副本的本地访问。

我对吗?

因为在源你提到很奇怪(JSR 220:企业JavaBeansTM,版本3.0 EJB核心合同和需求)“虽然有可能同时提供一个远程客户视图和一个enterprise bean的本地客户端视图,更通常只有一个或另将提供“。



Answer 4:

我想在我自己的电脑,两个接口(一个本地的其他远程)用同样的方法声明。

包计算值; 进口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的本地客户端视图,更典型地仅一个或另一个将被提供。

在这种情况下,只有远程接入,呼叫将是缓慢的,并没有人会得到当地的快速存取的优势。

我认为任何豆应该有一个本地接口,其中包括远程接口的方法。 远程接口的方法将是本地接口方法的一个子集。 与此,我们相信,远程客户端是在一个正常的方式提供服务,而本地的是在一个快速的方式提供服务。

难道他们告诉只是鼓励我们要为内部和外部的东西提供不同的豆类? 还是因为在更复杂的方法本地和远程访问会有很大的不同?



文章来源: EJB3 - Session Bean calling method of another bean interface