我们可以根据一下因素来决定是选用远程访问还是本地访问:
l CMR:如果一个企业Bean是CMR的靶子,那么它必须实现本地访问。
l 企业Bean之间的关系是紧耦合还是松耦合:紧耦合的企业Bean互相依赖。例如一个订单必须有一条或者多条商品条目,这些条目脱离订单就毫无意义。表示它们的EntityBean OrderEJB和LineItemEJB是典型的紧耦合模型。紧耦合关系的企业Bean一般都在同一个商业逻辑单元里,而且他们通常会用频繁的相互调用。所以最好考虑在紧耦合的企业Bean之间使用本地访问,会大大的提高性能。
l 客户端的类型:如果企业Bean是被J2EE应用程序客户端访问,那么它必须允许远程访问。在生产环境中,客户端大多数情况下运行在和J2EE服务器不同的机器中。如果客户端是Web应用或者其他的企业Bean,那么它们也可以和被访问的企业Bean部署在同一个环境中,访问方法也取决于如何部署应用程序。
l 组件部署:J2EE应用程序是可升级的,因为服务器端的组件可以本分布在多个不同的机器中。例如一个分布式应用程序的Web应用可以运行在与它调用的企业Bean不同的服务器中。在这种分布式场景下,企业Bean必须允许远程访问。
如果你还不能确定使用哪种访问方式,那就选择远程访问。它可以让你的应用程序更灵活——在以后你可以任意分布部署你的应用程序组件以适应不断增长的需求。
虽然很少这样做,但企业Bean也可以两种访问方式同时与允许,这样它就要同时实现Remote和Local两组接口。
性能和访问方式
因为诸如网络反应时间之类的因素,远程调用会比本地调用慢。另一方面,如果在不同的服务器上分布组件,又可以提高应用程序的整体性能。这两种描述都是概念性的,实际情况中性能在不同的运行环境中会出现很大的变化。然而你应该谨记你的设计会给应用程序的性能造成什么样的影响。
方法参数和访问方式
访问方式会影响客户端调用的企业Bean方法的参数和返回值的类型。
隔离
远程调用中的参数是传值的,它们是对象的拷贝。但是本地调用的参数是传引用的,和一般的Java方法调用一样。
远程调用的形式参数核实参事相互隔离的。在调用过程中,客户端和企业Bean对不同对象拷贝操作。如果客户端改变了对象,企业Bean中的对应对象并不会跟着改变。这个隔离层可以保护企业Bean不会被客户端以外的修改数据。(这也造成了值对象模式的一些弊端,如不可以同步刷新而可能造成脏数据,见J2EE核心模式,值对象模式。可见有其利必有其弊:)
在本地调用的过程中,因为引用同一个对象,客户端和企业Bean都可能修改都操作同一个对象。但是一般情况下,请不要以来这种效果来实现什么功能,因为可能以后有一天你要分布部署你的组件,而需要用远程调用来替换本地调用。
数据访问粒度
因为远程调用会比本地调用慢,远程方法的参数应该设计成粗粒度对象。由于粗粒度对象比细粒度对象包含更多的数据,所以也减少了调用次数。(这也是值对象模式的初衷,下面的CustomerDetials对象就是值对象的一个例子)
例如,假设CustomerEJB是通过远程访问的。那么它就可能只有一个getter方法用来返回一个CustomerDetails对象。但是如果它是通过本地访问的,那么它就可以为每一个企业Bean的字段提供一个getter方法:getFirstName、getLastName、getPhoneNumber等等。因为本地调用要比远程调用快很多,这些多次getter方法的调用并不会明显的影响性能。(注意这里说的这些getter方法都是指在Remote或者Local接口里声明的客户端可访问的方法)

解决方案 »

  1.   

    楼上得不用这么费劲吧!localhome就是本地得组件在调用别得组件时候用得方法,为什么
    要这么用那,如果要用home得话那就要通过RMI来进行,这样效率比较底,在EJB1的时候是这样用的在2。0就改进了。你要记住LOCAHOME 就只适合本地机器的。
      

  2.   

    leric写得不错,对于何时采用本地或远程我已经比较清楚了,不过我想知道本地调用具体是如何实现的?
    它跟配置ejb-ref,ejb-local-ref标签有什么关系?
    另外它跟JNDI里的lookup("java:comp/env/ejb/*")方式又有什么关系?我只会用JNDI名称查找。
      

  3.   

    我在jb下将ejb的类型选择local/remote,没有配置ejb-local-ref,好象也可以使用本地调用,这是怎么回事。
    再问本地调用跟配置ejb-ref,ejb-local-ref标签有什么关系?
    另外它跟JNDI里的lookup("java:comp/env/ejb/*")方式又有什么关系?我只会用JNDI名称查找。