Java性能(3)调整你的EJB

 

通用规则

一下的几条规则可以有效地提高EJB的性能,不过请留意把一个应用分解成很多个EJB元件会减低性能。EJB元件不是简单的Java 对象,, 他们是包含远程接口调用,安全,事务以及属性和方法的元件。

使用高性能的Beans

尽可能多的使用高性能的EJB能从整体上提高你的应用的性能。

一下是EJB元件的种类,从高性能到地性能排列:

  • 无状态对话Bean(Stateless Session Beans) 和 消息驱动Beans(Message Driven Beans)
  • 状态对话Beans(Stateful Session beans)
  • 配置成只读的Container managed Persistence(CMP) entity beans.
  • 配置成只读的Bean managed Persistence(BMP) entity beans.
  • CMP beans.
  • BMP beans.

使用缓存

合理的使用缓存可以大大地(Greatly)提高性能,例如:

  • 缓存EJB引用(Cache EJB references): 用来避免每个request都有JNDI查询, 在servlet里面缓存EJB引用。
  • 缓存EJB的home接口:因为频繁的调用home接口非常昂贵,所以可以在servlet的init()方法里面缓存EJBHomes。
  • 缓存EJB资源(EJB resources):使用setSessionContext()或者ejbCreate()来缓存EJB resources. 这又是一个使用Bean生命周期方法来执行应用的操作。记得在ejbRemove()方法里面释放获得的资源。

使用合理的Stubs

当EJB的客户端需要的时候,应用中所需的的Stub类是在动态运行中生成的。这就说明在部署一个有远程EJB元件的时候是不需要生成Stubs或者retrieve客户端Jar文件的。在部署应用的时候,不再需要指定retrieve选项,这样会提高不熟的速度。

去掉不需要的状态对话bean

去掉不需要的状态对话Bean能避免passivating他们,passivating需要磁盘操作。

缓存(cache)和 池(Pool)调整技巧

  • 明确的调用remove()方法:允许在EJB客户端明确的调用remove()方法来remove容易中缓存的状态对话Bean
  • 调整实体Bean的池大小:实体Bean用到了EJB池和缓存设置,调整实体bean池的大小来最小化bean的创建和摧毁。设置池的大小为一个稳定的非零的size会得到更好的反应速度。
  • 缓存与Bean相关的资源: 使用setEntityContext()方法来缓存与Bean相关的资源,然后用unSetEntityContext()方法释放他们。
  • Identify(确认) 只读(read-only) beans:把只进行只读操作的ejb配置成只读的ejb.

使用Local和remote接口

这一段主要探讨一些当EJB元件被local或者remote客户调用是的考虑。

推荐使用本地接口(Local Interfaces)

一个EJB元件可以拥有远程和本地接口,如果客户端和EJB不是在同一个服务器实例运行,需要使用远程接口来访问EJB.调用远程接口需要 Marshalling Arguments, 还需要通过网络传输编码过得(marshalled)data, 反编码(un-marshaling)arguments 和 在接收结束的时候dispatch数据。另外,使用remote 接口需要很大的资源(significant overhead).

如果EJB 元件有local接口,那么在同一个服务器实例的本地客户端可以调用本地接口而不是远程接口,使用本地接口更有效,因为不需要argument marshaling, 传输和un-marshalling.

如果一个EJB只被local客户端调用,那么可以只提供local 接口, 如果EJB是分开部署的,那么你应该同时提供本地接口和远程接口,这样远程客户就可以调用远程接口,本地接口调用本地接口。

使用引用传递

默认情况下,Application Server使用值传递方法法调用远程接口,就算他是在一起的(co-located)的, 这样会很昂贵,因为客户端使用值传递必需要在传递参数之前复制他们。

不管怎样,本地客户端可以使用引用传递,这样本地和远程接口可以共享传递过去的对象,但是这也说明参数对象必须被合理的实现(implemented),所以他们才能被共享。一般情况下,在可能使用引用传递的情况下使用应用传递会更高效。

合理的使用本地和远程接口会使客户端更高效的访问EJB元件, 就是本地接口使用本地接口和引用传递,远程接口使用远程接口和值传递。

但是,在一些情况下并不能使用本地接口,例如:

  • 在EJB2.0 specification之前的应用,没有local接口。
  • 有一些bean-to-bean调用,而且这些客户端的bean根本没有对被调用的bean做co-location的假设。

提高EJB事务的性能

  • 使用容器管理的事务(Use Container-Managed Transactions)
  • 不要包含用户输入时间(Don’t Encompass User Input Time):为了避免资源被长时间不必要的占用,一个事务不应该包含用户输入时间或者用户思考时间,我的理解是尽量把你的transaction写的短。
  • 区分非事务的方法:声明session EJB的非事务方法为NotSupported 或者NeverTransaction 属性。这些属性可以在ejb-jar.xml部署描述符文件中找到。事务应该在最短的时间完成因为他们会锁数据库的rows.
  • 为长的事务链(Long Transaction Chains)使用TX_REQUIRED
  • 使用最低消耗的数据库锁:使用数据库提供的最低消耗的数据库锁,在事务完成的时候提交数据而不要在每一个方法调用之后。
  • 只有在需要的时候使用XA-Capable数据源:当多个数据资源,链接资源或者JMS资源都在同一个transaction中使用时,需要执行 一个分布的或者全局的事务,这样的话就需要XA capable资源管理器和数据源。只有在两个或者两个以上数据源在同一个事务中使用的时候再使用XA capable 数据源。当一个数据库部署在一些分布式的事务中,但是绝大多数都是本地的或者单个的数据库事务,那么就应该注册两个不同的JDBC源,然后在应用中使用合 适的那一个。

使用消耗最低的Transaction Attribute

在EJB deployment 描述文件中(ejb-jar.xml)中设置以下事务属性。以最好性能到最低性能列出如下:

  • NEVER
  • TX_NOTSUPPORTED
  • TX_MANDATORY
  • TX_SUPPORTS
  • TX_REQUIRED
来自我的小站 www.threes.cn
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值