用本地引用提高EJB访问效率

   EJB 1.0和1.1规范只定义了一种在EJB组件中引用另一组件的方法,即通过Bean的远程接口。如果两个Bean都在同一个容器之内,则这种网络开销是不必要的。为解决这个问题,EJB 2.0规范定义了一种新的EJB引用类型,即本地引用。

一、两种引用类型

   为了从其他EJB组件访问某个Bean,容器提供了一种特殊的机制。这种机制允许一个Bean提供者通过称为EJB引用的“逻辑名字”引用另一个EJB的Home。EJB容器利用应用的部署描述器为EJB构造环境,而这些引用在部署描述器中作为特殊的项目声明。在部署描述器中,部署者把组件代码中要用到的EJB引用绑定到其他被引用EJB的Home。

   如前所述,在EJB 2.0规范出现之前,在一个EJB中引用其他Bean只有一种方法,即通过远程接口,它要求进行跨越网络的远程过程调用。如果某个事务由多个Bean协作完成,通过网络进行多个对象的汇集和释放将是一项相当繁重的工作。

   EJB 2.0规范新增了一种本地接口类型,允许在同一容器之内的Bean直接互相引用,避免了远程接口的网络开销。本地接口是一种标准的Java接口,而不是从RMI继承得到。EJB组件的定义可以包含本地接口或远程接口,或者两者都定义。

   本地引用的指定方式和传统的远程引用一样,即在部署描述器中指定。事实上,本地引用的部署描述元素与远程引用的描述元素完全对应。

下面的代码片断是一个典型的远程引用:

Product
ejb/Product
Entity
com.xyz.widgets.ProductHome
com.xyz.widgets.Product
../products/product.jar#Product

下面的代码片断是同一Bean的本地引用:

Product
ejb/Product
Entity
com.xyz.widgets.ProductHome
com.xyz.widgets.Product
../products/product.jar#Product

下表简要说明了各个元素的用途:

二、创建本地接口,通过本地接口访问EJB

  要把一个现有的远程接口改为本地接口,有三个地方必须修改:部署描述器,Bean的接口,以及对EJB的调用。前面我们介绍了如何通过部署描述器指定一个本地引用,现在我们要把远程接口转换成本地接口,然后修改JNDI查找调用,让它使用新的本地接口。

■ Home接口

  指定Home接口时,现在必须导入的是“javax.ejb.EJBLocalHome”,而不是“javax.ejb.EJBHome”。接口的声明也必须改变,让它从“EJBLocalHome”(一个标准Java接口)继承,而不是从“EJBHome”(一个RMI接口)继承。同时,从该接口定义的方法中唯一应该抛出的异常是javax.ejb.CreateException,而java.rmi.RemoteException异常则不再必要。

■ 本地接口

  指定本地接口时,现在必须导入“javax.ejb.EJBLocalObject”,而不是“javax.ejb.EJBObject”。接口声明也必须改变,让它从“EJBLocalObject”(一个本地接口)继承,而不是从“EJBObject”(一个RMI接口)继承。

■ 执行调用

  创建好接口、设置好部署描述器之后,剩下的工作就是执行JNDI调用,查找对其他EJB的引用。调用Bean的远程接口时,javax.rmi.PortableRemoteObject的“narrow()”方法汇集经过RMI的调用。对于本地引用,这种开销就不再必要,这时只需简单地进行JNDI查找并进行适当的类型定型。下面是一个例子:

home = (ProductHome) initCtx.lookup("java:comp/env/ejb/Product");

  它不仅提高了效率,而且代码也比用来获取远程接口的代码更直观易懂。

  本地接口使得处于同一容器内的两个EJB组件能够更高效地进行通信。对于实体Bean的应用来说,这种技术尤其有用,因为与客户程序直接访问实体Bean相比,在实践中,通过会话Bean访问实体Bean得到了更广泛的认可。

  如果你准备使用本地引用,请先检查自己的应用服务器平台是否支持它。也许,在EJB 2.0规范获得广泛应用之前,我们还得等待一段时间。

转自:http://www.bianceng.cn/java/j110.htm

为什么需要调用ejb的本地接口 ?

答: 当ejb的服务端和客户端在一个JVM的时候,为了提高jndi查询效率,并且提高方法调用效率,本地调用可以不走TCP/IP ,这样可以明显提高调用的效率!

ejb2.0 开发本地接口的 步骤:

朝花夕拾,还是用我的原来ejb2.0的例子,现在需要增加在 原有的基础上增加本地调用的接口

第一步:

一共有5个接口,只做远程调用的时候是3个,后面的两个接口是我们做本地调用的时候需要的

1.远程home接口

2.远程remote接口

3.远程实现接口

4.本地接口

  1. package cn.com.xinli.ejb;
  2. import javax.ejb.EJBLocalObject;
  3. public interface HelloWorldLocal extends EJBLocalObject
  4. {
  5. public String sayHello();
  6. }

5.本地home接口

  1. package cn.com.xinli.ejb;
  2. import javax.ejb.EJBLocalHome;
  3. public interface  HelloWorldLocalHome extends EJBLocalHome
  4. {
  5. HelloWorldLocal create() throws javax.ejb.CreateException;
  6. }

第2步: 编写 ejb-jar.xml ,指定这5个接口的具体实现类

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
  3. "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
  4. <ejb-jar>
  5. <description>ejb</description>
  6. <display-name>myEJBTest</display-name>
  7. <enterprise-beans>
  8. <session id="ejb_hello">
  9. <display-name>helloEJB</display-name>
  10. <ejb-name>helloEJB</ejb-name>
  11. <home>cn.com.xinli.ejb.HelloWorldHome</home>
  12. <remote>
  13. cn.com.xinli.ejb.HelloWorldRemote
  14. </remote>
  15. <local-home>cn.com.xinli.ejb.HelloWorldLocalHome</local-home>
  16. <local>cn.com.xinli.ejb.HelloWorldLocal</local>
  17. <ejb-class>
  18. cn.com.xinli.ejb.HelloWorldBean
  19. </ejb-class>
  20. <session-type>Stateless</session-type>
  21. <transaction-type>Bean</transaction-type>
  22. </session>
  23. <message-driven id="ejb_mdb">
  24. <ejb-name>mdb</ejb-name>
  25. <ejb-class>cn.com.xinli.ejb.mdb.MDBean</ejb-class>
  26. <transaction-type>Bean</transaction-type>
  27. <acknowledge-mode>Auto-acknowledge</acknowledge-mode>
  28. <message-driven-destination>
  29. <destination-type>javax.jms.Queue</destination-type>
  30. </message-driven-destination>
  31. </message-driven>
  32. </enterprise-beans>
  33. </ejb-jar>

第3步: 编写 jboss.xml,指定 远程JNDI 和本地JNDI

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <jboss>
  3. <enterprise-beans>
  4. <session>
  5. <ejb-name>helloEJB</ejb-name>
  6. <jndi-name>helloEJB</jndi-name>
  7. <local-jndi-name>helloEJBLocal</local-jndi-name>
  8. </session>
  9. <message-driven>
  10. <ejb-name>mdb</ejb-name>
  11. <configuration-name>Standard Message Driven Bean</configuration-name>
  12. <!-- 消息驱动bean 监听的消息队列的 JNDI
  13. <destination-jndi-name>queue/mdb</destination-jndi-name>
  14. -->
  15. </message-driven>
  16. </enterprise-beans>
  17. </jboss>

第4步: 编写 测试页面 ,为了让调用的客户端和ejb 服务器 在一个JVM中,我们需要写一个jsp页面,放在JBOSS的一个war包下,通过JBOSS服务器来访问这个页面,这个页面里面去掉JBOSS服务器上的ejb, 如果你是在 eclpiese 中写的main 方法或者 ejb 的客户端可服务器端就不在一个JVM 中是无法调用Local 接口的

testejb.jsp

  1. <%@ page contentType="text/html;charset=gb2312"%>
  2. <%@page import="javax.naming.InitialContext"%>
  3. <%@page import="java.util.Properties"%>
  4. <%@page import="javax.naming.Context"%>
  5. <%@page import="cn.com.xinli.ejb.HelloWorldLocal"%>
  6. <%@page import="cn.com.xinli.ejb.HelloWorldLocalHome"%>
  7. <%
  8. System.out.println("===========================================================");
  9. Properties props = new Properties();
  10. props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
  11. props.setProperty("java.naming.provider.url", "localhost:1099");
  12. props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
  13. try
  14. {
  15. Context ctx = new InitialContext();
  16. HelloWorldLocalHome localHome= (HelloWorldLocalHome) ctx.lookup("local/helloEJB@13889929");
  17. HelloWorldLocal local=localHome.create();
  18. out.println(local.sayHello());
  19. }
  20. catch (Exception ex)
  21. {
  22. ex.printStackTrace();
  23. }
  24. %>

结果图:

ejb2.0用本地引用提高EJB访问效率的更多相关文章

  1. java提高数据库访问效率代码优化

    package com.jb.jubmis.comm; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQL ...

  2. for循环提高内存访问效率的做法

    今天写程序的时候突然想到一点,记录一下: 计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的 ...

  3. 提高Dom 访问效率

    在浏览器中对于Dom的操作和普通的脚本的操作处于两个不同的dll中,两个dll的交互是比较耗时的,优化对Dom的操作可以提高脚本的执行速度. JS访问DOM是很慢的,尽量不要用JS来设置页面 布局 有 ...

  4. EJB通过ANT提高EJB应用的开发效率、开发具有本地接口的无状态bean、开发有状态bean

    把jboss集成进eclipse 关闭Jboss控制台按Ctrl+c,在MyEclipse→Servers→Jboss里面可以配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorl ...

  5. EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean

    该jboss集成到eclipse 关掉Jboss控制台新闻Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorld ...

  6. EJB2.0版本的HelloWorld

    EJB2.0版本的HelloWorld   虽然EJB3.1已经出来了,可是EJB2.0的项目还需要维护啊.下面写个简单EJB2.0的HelloWorld程序,练练手.   环境: JBoss 4.0 ...

  7. 利用curl并发来提高页面访问速度

    在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个.顺序访问,假如有3个接口,每个接口耗时500毫 秒那么我们三个接口就要花费1500毫秒了,这个问题太头 ...

  8. android studio开发工具的android library打包文件(.aar)本地引用

    by 蔡建良 2014-5-13 关键点: 利用Gradle发布本地maven库支持android library 打包文件(*.aar) 的本地引用 开发环境: windows7 64位操作系统 a ...

  9. 提高磁盘访问性能 - NtfsDisableLastAccessUpdate

    这个技巧可以提高磁盘访问性能,不过仅适用于NTFS文件系统. 我们知道,当在磁盘管理应用程序中列出目录结构时──效果类似“资源管理器”.“文件管理 器”(Windows NT  3.xx/4.0下的称 ...

随机推荐

  1. Python复习 基础知识

     动态语言:变量类型不固定称之为动态语言 什么是动态语言呢? 可以简单的理解为直接被解释执行的语言称为动态语言. 而需要编译环境将程序转换为其它的编码再执行的语言称为静态语言. 当前静态语言有:jav ...

  2. 我叫mt3.0更新公告

    1.增加卡牌: (1)炮姐,种族:牛头人,职业:元素萨满,可在任务中使用万能碎片兑换,最多兑换5张: (2)娘子,种族:德莱尼人,职业:治疗萨满,进化材料为死亡视察者: 详情点击查看>>& ...

  3. 如何使得 python 脚本 不一闪而过

    1.  简单的方法是在最后加上如下语句: os.system("pause") 2. 但是这个不一定有用,原因是可能在之前的代码中发生异常,那么我们看到的效果也是直接一闪而过 办法 ...

  4. word2vec改进之Negative Sampling

    训练网络时往往会对全部的神经元参数进行微调,从而让训练结果更加准确.但在这个网络中,训练参数很多,每次微调上百万的数据是很浪费计算资源的.那么Negative Sampling方法可以通过每次调整很小 ...

  5. PJzhang:robots协议的实际场景

    猫宁!!! 参考链接: https://bbs.360.cn/thread-15062960-1-1.html https://ziyuan.baidu.com/college/courseinfo? ...

  6. (转)cookie和session的区别

    转自 http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html http://justsee.iteye.com/blog/15 ...

  7. Java 执行linux命令(转)

    转自 http://blog.csdn.net/a19881029/article/details/8063758 java程序中要执行linux命令主要依赖2个类:Process和Runtime 首 ...

  8. error: unrecognized command line option "-std=c11" 解决办法

    今天在安装php版本 grpc扩展的时候报错如下: cc1: error: unrecognized command line option "-std=c11" cc1: war ...

  9. python模块之hmac

    # hmac模块使用步骤: # hmac模块模块的使用步骤与hashlib模块的使用步骤基本一致,只是在第1步获取hmac对象时,只能使用hmac.new()函数, # 因为hmac模块没有提供与具体 ...

  10. iOS常用的存储方式

    在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用的存储工具/方式: NSU ...