Performance EJB3-另一个Bean接口的会话Bean调用方法

Performance EJB3-另一个Bean接口的会话Bean调用方法,performance,interface,ejb-3.0,local,Performance,Interface,Ejb 3.0,Local,我有一个小问题。。。 我搜索了访问仅在bean的远程接口中声明的方法和不在本地接口中声明的方法之间的本地访问差异 接口声明(远程或本地)是否确定方法的访问协议?或者ejb容器是否理解两个bean都运行相同的JVM? 有很大的性能差异吗? 你有这方面的消息来源吗 比尔的 Laurent我建议您在EJB容器上测试它,以确保安全 这就是说,根据规范(,第3.2.3节)@远程接口必须使用按值参数传递,而@Local则采用按引用参数传递 这意味着,即使客户端和@remotebean都在同一个JVM上,也存

我有一个小问题。。。 我搜索了访问仅在bean的远程接口中声明的方法和不在本地接口中声明的方法之间的本地访问差异

接口声明(远程或本地)是否确定方法的访问协议?或者ejb容器是否理解两个bean都运行相同的JVM? 有很大的性能差异吗? 你有这方面的消息来源吗

比尔的


Laurent

我建议您在EJB容器上测试它,以确保安全

这就是说,根据规范(,第3.2.3节)@远程接口必须使用按值参数传递,而@Local则采用按引用参数传递

这意味着,即使客户端和@remotebean都在同一个JVM上,也存在参数复制的开销


这还意味着所有@Remote参数都必须是可序列化的。

因此,如果我创建一个没有本地接口的bean,同一ejb容器中的任何bean都会因为该开销而变慢? 因此,如果存在本地访问,则最好始终声明本地接口,即使此本地接口“只是”远程接口的副本

我说得对吗

这很奇怪,因为在您提到的源代码中(JSR220:EnterpriseJavaBeanstm,版本3.0) EJB核心合同和需求)
“虽然可以为企业bean提供远程客户端视图和本地客户端视图,但通常只提供其中一个。”

是的,您是对的,@remote总是比@local慢,因为它总是有更多的工作要做

将bean的接口同时公开为@Local和@Remote的问题在于参数和返回值语义不清楚(规范称这是罕见的)。例如,如果您有一个方法:

List filter(List arg);

…如果bean通过修改参数来实现此方法,那么客户端必须非常小心,以确保在调用方法(@Local)之前复制对象,或者在自动复制对象(@Remote)时避免浪费。此外,bean必须小心,不要将可变状态从@Local接口传递给其调用方。虽然列表中的情况可能很清楚,但对于java.util.Date之类有问题的序列化文件,或者bean是否希望返回“常量”数组,可能就不那么清楚了。

我在自己的pc上尝试过,两个接口(一个本地,另一个远程)声明了相同的方法

包计算; 导入javax.ejb.Remote

@遥远的 公共接口计算器{

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. " ;
}
@EJB
公共计算器删除myRemoteCalc;
@EJB
公共计算器本地myLocalCalc;
公共字符串最快(int iter){
myRemoteCalc.add(5,6);
myLocalCalc.添加(5,6);
long inittimeLocal=System.currentTimeMillis();
对于(int j=0;j