`
helloyesyes
  • 浏览: 1323635 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

JAVA技术提升EJB性能的方法

阅读更多
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的方法可以读取操作数据的中间状态,但是时他们无法得知是否增加了新的记录。

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

  设计和开发后期

  在一个企业级应用的开发后期阶段我们必须关注与性能相关的部分对整个系统进行调整。余下的4点就是针对工程的这个阶段。

  9.模拟实际运行环境进行调整

  这里的策略是查看整个系统,包括Web服务器,应用服务器和数据库服务器。可以考虑执行以下任务:

  •   运行整个应用程序
  •   使用厂家推荐的版本和补丁
  •   模拟实际运行的数据
  •   使用实际运行的资源(比如设备)
  •   利用负载测试工具模拟用户负载

  10. 利用工具识别性能瓶颈

  在这个方法中,我们使系统高负载并监视所有机器的CPU,内存 , I/O和网络的使用情况。识别性能瓶颈的地方后,反复测试,查看具体的问题所在。代码段1列出了各种用于测试程序的各方面性能的工具。要使EJB 应用程序取得高性能,重要的一点是识别性能瓶颈。

  11.调整系统参数

  应用程序中的许多参数是是可调的。例如,在操作系统中,我们可以调整TCP/IP参数,文件限制数,进程限制数和 IPC限制数。在应用服务器上则可以调整连接池参数,EJB池大小,线程数,JVM个数以及JVM堆栈大小。在数据库服务器上,我们可以调整连接和进程的个数,共享池的大小,缓冲区大小,索引和SQL查询提示。在Web服务器上,可以调整保持连接的参数,线程/进程的个数和连接的backlog.

  12.采用群集来满足高负载或考虑升级硬件

  有时达到了某种程度时调整代码乃至整个系统会比增加新硬件的开销更大。这种情况下群集有显著的优势。大多数应用服务器都提供了群集的特性。一个 EJB本质上就是在多台机器上运行的一组EJB服务器,用于增加系统的马力。一般群集中的每台应用服务器都含有相同的 EJB。服务器群集采用各种不同的算法来实现负载均衡,例如round robin, random, sticky bit, server load等。可以在多个层次上采用群集,如图2所示。

  图2: 群集的群集:在不同层次的群集增加了系统的马力

  以上12点可以帮助我们设计和实现一个高性能的基于EJB的企业级应用。综合使用这些技巧以使我们的应用程序达到最优化。

  代码段 1. 一个设计欠佳的远程接口

  若使用以下接口,客户端必须多次调用才能获取数据。我们可以通过使用粗粒度的方法加速这个过程。

  public interface Person extends EJBObject
  {
  public String getFirstName()
  throws RemoteException;
  public void setFirstName(String firstName)
  throws RemoteException;
  public String getLastName()
  throws RemoteException;
  public void setLastName(String lastName)
  throws RemoteException;
  public int getPersonId()
  throws RemoteException;
  public void setPersonId(int personId)
  throws RemoteException;
  }

代码段2. 一个更好的方法

  这里我们对代码段1所展示的接口进行改进。只不过这些接口方法一次可以传递更多的数据。

  public interface Person extends EJBObject
  {
  public PersonData getPersonData()
  throws RemoteException;
  public void setPersonData(
  PersonData personData)
  throws RemoteException;
  }
  /* 这是一个value对象. value对象可以取得 细线优化的方法*/
  public class PersonData implements Serializable
  {
  PersonData(String firstName, String lastName,
  int personId)
  {
  this. firstName = firstName;
  this. lastName = lastName;
  this. personId = personId;
  }
  public String getFirstName() {
  return firstName ; }
  public String getLastName() {
  return lastName; }
  public int getPersonId(){ return personId; }
  private String firstName;
  private String lastName;
  private int personId;
  }

  代码段3. 建立一个Facade

  服务器端的facade为多个对象提供统一的接口。在这个例子中,ServerFacade为程序要用到的所有EJB的home handle提供缓存。

  /* ServerFacade 为服务端的EJB 提供一个统一的接口。
  所有客户端的类都通过ServerFacade访问服务器
  */
  public class ServerFacadeBean implements SessionBean
  {
  file://缓存所有需要的EJB的home handle.
  /* Person EJB 的home handle*/
  PersonHome personHome = null;
  /* Bank EJB的home handle*/
  BankHome bankHome = null;
  ...
  public ServerFacadeBean()
  {
  initialize();
  }
  public void initialize()
  {
  try
  { /* 初始化所有的Home handle.
  We could also do lazy initialization
  i.e., initialize as And when a home
  handle is needed.
  /* get initial context */
  Context ctx = ...
  if ( personHome == null )
  personHome = (PersonHome)
  ctx.lookup(“PersonHome”);
  if ( bankHome == null )
  bankHome = ( BankHome)
  ctx.lookup(“BankHome”);
  }
  catch(Exception e)
  {
  /* 异常:查找失败*/
  }
  }
  public PersonData getPersonData(int personId)
  throws RemoteException
  {
  /*使用personHome缓存的副本*/
  try
  {
  Person person = personHome.findByPrimaryKey(personId);
  return person.getPersonData();
  }
  catch(Exception e)
  {
  /*异常处理*/
  }
  }
  public BankData getBankData(int bankId)
  throws RemoteException
  {
  /* 使用bankHome handle 缓存的副本*/
  try
  {
  Bank bank =bankHome.findByPrimaryKey(bankId);
  return bank.getBankData();
  }
  catch(Exception e)
  {
  /*异常处理*/
  }
  }
  ...
  }



代码段4.一个调用

  为了避免一次远程调用返回数据库的一行,可以用会话EJB对象将所有的数据打包成单个调用。

public class ServerFacadeBean implements SessionBean

  {
  ...
  >// 将行向量返回给客户端
  public Vector findPersonsWithFirstName(
  String firstName) throws RemoteException
  {
  Vector vector = new Vector();
  Enumeration enumeration = null;
  try
  {
  enumeration = personHome.findPersonsWithFirstName (firstName);
  PersonData personData = null;
  if ( enumeration != null )
  {
  while ( enumeration.hasMoreElements() )
  {
  Person person = (Person)enumeration.nextElement();
  personData = person.getPersonData();
  vector.addElement(personData);
  }
  }
  }
  catch(Exception e)
  {
  >/* 异常处理 */
  }
  return vector;
  } ...
  }

分享到:
评论

相关推荐

    java反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJB

    总的来说,Java反射和EJB都是Java编程中的高级特性,它们为开发带来了便利,但同时也需要谨慎使用,因为不当的使用可能导致性能下降、安全性风险增加等问题。理解和熟练掌握这两个概念,对于提升Java开发水平和解决...

    Java程序设计EJB、XML与数据库

    Java程序设计EJB、XML与数据库是IT领域中三个核心的技术点,它们在现代软件开发中扮演着至关重要的角色。让我们逐一深入探讨这些知识点。 **Java程序设计**:Java是一种跨平台的面向对象的编程语言,由Sun ...

    Java之精通EJB3.0.pdf

    EJB3.0增强了对异步方法的支持,通过`@Asynchronous`注解即可实现异步调用,这对于提高应用程序性能和响应性具有重要意义。 **4. 容器管理实体Bean:** EJB3.0引入了容器管理实体Bean(CMB),这是一种新的持久化...

    Java编程语言中EJB技术的详细说明

    Enterprise JavaBean(EJB)是Java编程语言中用于构建企业级分布式应用程序的关键技术。EJB 1.1规范是EJB技术的早期版本,旨在提供一个框架,让开发者能够创建可部署在服务器端的组件,这些组件能够在网络环境中为...

    Java程序设计EJB XML与数据库

    Java程序设计EJB XML与数据库是IT领域中的一个重要主题,主要涵盖了Java企业级应用开发、Entity Bean(EJB)技术、XML(可扩展标记语言)的使用以及与数据库的交互。这三个方面是构建大型、分布式、面向服务的企业...

    java源码:EJB中JNDI的使用源码例子.zip

    Java源码:EJB(Enterprise JavaBeans)是Java EE(Java Platform, Enterprise Edition)...通过这个源码例子,开发者不仅可以学习到EJB的基本用法,还能掌握JNDI在服务查找中的作用,从而提升自己的Java EE开发能力。

    Java EJB 经典面试题 面试时被问过几个

    而EJB则是Java的分布式组件,基于RMI实现远程方法调用,可以跨进程、跨计算机访问。EJB必须部署在应用服务器中,如Websphere、WebLogic,客户端通过容器间接访问EJB组件,而不是直接与组件交互。 96、EJB实现的技术...

    EJB技术介绍

    4. **资源管理**:EJB容器管理数据库连接、线程池等资源,提高性能和效率。 5. **服务集成**:EJB可以轻松集成其他Java EE服务,如JTA(Java Transaction API)、JMS、JPA等。 **EJB的分类** 从压缩包的文件名来看...

    EJB全实例教程

    远程接口使用Java RMI(Remote Method Invocation)技术实现,使客户端能够像调用本地方法一样调用EJB方法。 **EJB教程中的实例:** 教程可能包括创建一个简单的EJB项目,涵盖以下步骤: 1. 创建EJB项目结构,包括...

    JNDI调用分布式EJB3 通用接口

    在IT行业中,Java Naming and Directory Interface (JNDI) 是一个关键的技术,它提供了一种标准的方法来查找和访问各种命名和目录服务。EJB(Enterprise JavaBeans)是Java EE平台的一部分,用于构建可部署在服务器...

    Java Jsp EJB Spring学习

    ActionScript 3.0的出现带来了显著的性能提升和更严格的面向对象编程支持,使其与Java等服务器端技术有了更多的交集。 至于“打开方式.htm”和“爱书吧-2万本图书免费下载.url”,它们可能是指向网络资源的链接,...

    Java程序设计 EJB、XML与数据库

    Java程序设计,特别是涉及到EJB(Enterprise JavaBeans)、XML(eXtensible Markup Language)以及数据库,是企业级应用开发中的关键技术。本篇将深入探讨这三个重要领域,旨在帮助开发者构建高效、可扩展和安全的...

    java笔试题大集合及答案(jsp-java-ejb公司笔试题)

    Java笔试题大集合是针对Java开发者的一份综合测试资料,涵盖了JSP、Java核心和EJB(Enterprise JavaBeans)等关键领域。这份资料对于准备Java相关的面试或笔试具有极高的价值,因为它帮助开发者复习和检验自己的技能...

    jpa.zip_Java EJB

    - ejb3_chapter03_4_client 和 ejb3_chapter03_4 可能讲解了EJB 3.x中的异步调用和多线程处理,这是提高应用程序性能和响应性的重要概念。 - ejb3_chapter03_2 和 ejb3_chapter03_2client 可能涵盖EJB 3.x的实体...

    java EJB设计模式

    **Java EJB设计模式** Enterprise JavaBeans(EJB)是Java ...同时,随着Java EE技术的发展,如CDI(Contexts and Dependency Injection)的出现,一些传统EJB模式得到了简化或替换,但它们背后的原理和思想仍然重要。

    EJB3.1技术培训

    - **无状态会话Bean (Stateless Session Bean)**:这种类型的Bean不保留任何客户特定的状态信息,因此它可以在多个客户端之间共享,从而提高性能。 - **有状态会话Bean (Stateful Session Bean)**:与无状态会话...

    Pro EJB 3 Java Persistence API

    总之,《Pro EJB 3 Java Persistence API》是Java EE开发者深入学习EJB 3.0和JPA的宝贵资源,它可以帮助读者掌握如何利用JPA简化企业级应用的数据持久化,提升开发效率,并确保应用程序的稳定性和性能。通过阅读本书...

    EJB方面 ejb pdf

    EJB(Enterprise JavaBeans)技术自1998年首次推出以来,经历了多个版本的演进,其中EJB 2.0是EJB 1.1的重要升级版,带来了诸多改进和新特性,旨在简化企业级应用开发,提高性能和灵活性。 - **规范内容扩展**:EJB...

Global site tag (gtag.js) - Google Analytics