科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道JAVA技术提升EJB性能的方法(上)

JAVA技术提升EJB性能的方法(上)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Enterprise JavaBeans(EJB)是一种被广泛采用的基于J2EE平台上的服务端组件体系架构,它可以用来快速开发灵活的、可重用的、可移植到各个中间件平台上的以任务为关键的企业级应用。

作者:邱文宇 来源:IT专家网 2008年4月14日

关键字: EJB 提升 技术 java

  • 评论
  • 分享微博
  • 分享邮件
Enterprise JavaBeans(EJB)是一种被广泛采用的基于J2EE平台上的服务端组件体系架构,它可以用来快速开发灵活的、可重用的、可移植到各个中间件平台上的以任务为关键的企业级应用。同时,由于采用开放的协作制定规范,EJB架构能保护IT投资,减少对供应商的依赖性,避免局限在某一个供应商的技术实现上。其中,性能是EJB应用程序成败的关键。

  EJB的开发

  我们前八个EJB性能方面的技巧是关于在应用系统设计和开发阶段的。因为在服务器环境下,多数需要优化的代码,更多地是在布署阶段之前。以便在问题不可收拾前把问题找出并解决。

  1. 设计粗粒度(coarse-grained) 的EJB 远程(remote) 接口

  由于每个通过远程或本地(home)接口调用EJB的方法都属于远程调用,对于大多数细粒度(fine-grained)的对象交互来说调用中间件的开销大得简直让人无法承受。为了避免这类问题, 每个EJB应代表一个独立的业务对象,有独立的特性和生命周期。具有依赖性的对象决不能用EJB表示。相反,它应该作为一个EJB内部的Java类来实现。例如,一张购物单可用一个EJB来实现,而每张购物单上的子项就不应该用EJB,可以采用helper类的形式实现。

  2. 设计粗粒度的EJB远程接口方法

  正如上面所提到的,每个客户端对EJB的调用都是远程调用,另外还要进行一些检查操作,比如存取控制,事务处理以及激活/休眠等。 因此,EJB调用比远程调用要慢上好几倍,与调用本地方法的时间相差就更大了。减少方法的调用次数可以提高性能。设计粗线优化的方法中的一个技巧,就是在单个方法调用过程中尽量增加数据来回传输的数量,把多个方法合并以减少方法的个数。比如,代码段一显示的是一个设计欠佳的远程接口,因为客户端必须多次调用来取得Person的数据。相比之下代码段二改进了性能表现,因为它在一次方法调用中使用了粗粒度的方法,方法的个数变少了,从而减少了调用次数(尽管这些方法传输的数据更多)。

  3. 减少JNDI 查找次数

  由于各种应用服务器的命名和目录服务在具体实现方法上的差异,JNDI 的查找过程可能会比较费时。 (注:JNDI对EJB资源,比如数据源、bean引用,乃至环境项(environment entry)的查找可能花费巨大,且避免重复查找并非易事。)某些应用服务器在不同的机器上采用单独的进程来实现目录信息。在这种情况下缓存home handle是一个提升性能的好办法。(见代码段3). facade是一个对象,它为多个对象提供一个的统一接口。一个服务端的facade能简化处理,使得客户端不需了解每个服务器端的EJB(见图一)。在这种方式下所有客户端对服务器的调用都经由对象ServerFacade。如代码段3所示,ServerFacade是一个会话 EJB,缓存了所有需要的EJB的home handle.而客户也可以在客户端用singleton对象来缓存ServerFacade的home handle。

  图 1.客户端通过ServerFacade访问服务器。ServerFacade是一个会话 EJB,缓存了所有需要的EJB的home handle.

4. 利用会话 bean的包从一个实体 bean中返回多行数据

  通常,在我们的应用程序中一个bean表示数据库的一个逻辑行。实体 bean的本地接口中定义了一个或多个finder方法。每个方法用于查找一个实体对象或多个实体对象的集合。 在客户端通过调用实体bean的finder方法来取得实体对象的集合。 然后客户端从该集合依次取得数据。如果是远程客户端,每次远过程调用取得一行数据,资源开销太大了。我们可以采用一个在服务端的会话bean把所有的行打包,作为一个实体本地对象的finder方法的返回结果。代码段4 显示了一个会话 bean对象如何通过一次调用把多行数据的向量/集合发送到客户端。该方法可用在当GUI数据(如列表框或电子表格的数据)保持静态不变的情况。通过扩充这种办法也可以支持客户端的数据修改。

  5.采用会话 bean来处理大量的数据库操作

  实体bean适于一次处理数据库的一个逻辑行,但是在数据库的批量操作中会引发性能方面的很多额外开销。比如,一个返回1000行的实体bean的finder方法需要执行1001次数据库的select操作,导致性能急剧下降。如果用会话 bean来处理数据库的批量操作可以显著的提高性能(见代码段5),因为它减少了调用数据库的次数。

  6.尽可能采用CMP(container-managed persistence)容器管理bean代替 BMP(bean-managed persistence bean)

  在BMP方式中, 编写bean的人员必须自己在bean的方法中用JDBC,SQLJ等提供数据库访问代码。而在CMP方式中,由容器在EJB部署是自动生成数据库访问代码。编写bean的人员只需在部署描述器中指定要自动生成访问代码的实例的字段清单。 CMP的优点是使bean类能独立于数据源。另外的好处是应用服务器的厂家为CMP生成优化代码,以提升数据库访问性能。

  7.恰当的使用实体bean

  在某些特定的场合下适合使用实体bean。他们适用于只从数据库中取出少量数据行供多个用户同时访问。比如,在Person中,当个人登录系统后,他的记录可以缓存起来并让多个EJB访问,如SecurityBean, BankAccountBean等等。因此Person可以实体bean的形式存在。实体bean还适用于那些数据行需要在多个事务中被频繁更新的场合。

  由于性能方面的额外开销,实体bean 不合适大量数据行在数据库处理中的选取、插入或更新。这种情况下可考虑采用会话 bean,另外也可以在实体 bean中设计粗线优化的数据库访问操作。

  8.采用恰当的隔离级别

  隔离层次是指多个交替进行的事务处理之间避免相互干扰的程度。TRANSACTION_SERIALIZABLE是最高隔离层次。采用这个隔离级别会使整个过程相当缓慢,因为所有的事务处理(既便是简单的读操作)必须排成一队依次执行。执行的方法取得独占写入数据的锁定,避免其它事务处理对数据进行读取、更新或插入动作,直到该事务成功完成并提交工作。在TRANSACTION_REPEATABLE_READ级别,事务处理无法修改那些正在被其它事务处理读取的数据。写入锁定用来防止其它事务处理对数据的修改。采用 TRANSACTION_READ_COMMITED 级别时,当前事务不能其他事务操作数据的中间状态。因为它无法对正在被其它事务处理修改的数据加上写入锁定,所以也就无法读取修改一半的数据了。TRANSACTION_READ_UNCOM- MITED是最低的隔离级别。在这种级别中Bean的方法可以读取操作数据的中间状态,但是时他们无法得知是否增加了新的记录。

  隔离级别越高性能上开销也越大。通常情况下,较低的隔离级别允许更多的并发操作 ,代价是需要更加复杂的逻辑去处理潜在的数据不一致性的问题。一条有用的准则是在该企业信息系统可接受的性能范围内采用尽可能高的隔离级别。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章