服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

网友分享:构建高性能j2ee应用的10个技巧

【赛迪网-it技术报道】构建高性能的j2ee应用不但需要了解常用的实施技巧。下面介绍最常用的10种有效方法,可帮助架构设计师们快速成为这方面的专家。

java性能的基础----内存治理

任何java应用,单机的或j2ee的性能基础都可归结到你的应用是如何治理内存的问题。java的内存治理包括两个重要任务:内存的分配和内存的回收。在内存的分配中,目标是要减少需要创建的对象。 内存回收是导致性能下降的普遍原因。也就是说,内存中的对象越多,垃圾回收越困难。所以我们对创建对象的态度应该越保守越好。

在j2ee应用中常见的两个内存有关的问题是:游离的对象(也被称为内存泄露)和对象循环(指大量频繁创建和删除-在java中体现为解除引用---对象)。

我们应注重确保所有可到达的对象实际是活的,即这些对象不但在内存中,而且也要在执行的代码中是存在的。当对象在应用中已经没有用了,而我们却忘记了删除对该对象的引用时,游离的对象就出现了。

我们知道垃圾回收会占用cpu时间。短期对象的大量创建增加了垃圾回收的频率会造成性能下降。

不要在servlet中实现业务逻辑

在构建j2ee应用时,架构工程师通常会使用到j2ee的基本部分,servlet。

假如架构师不使用session beans, entity beans, 或 message beans, 那么改进性能的方法就很少。只能采用增加cpu或更多的物理服务器等方法。ejb使用了缓存(cache)和资源池等方法可以提高性能和扩展性。

尽可能使用本地接口访问ejb

在早期的j2ee (遵循ejb1.x规范)应用中,访问ejb是`通过rmi使用远程接口实现的。随着ejb2.0的出现,可以通过本地接口访问ejb,不再使用rmi,在同一个jvm中使用远程方法已经少多了。但是现在还是有一些使用ejb1.x实现的应用和不知道使用本地接口的一些ejb新手。为说明这点,我们作个比较:

  1, 客户端应用调用本地stub

  2, 该stub装配参数

  3, 该stub传到skeleton

  4, 该skeleton分解参数

  5, 该skeleton调用ejb对象

  6, ejb对象执行容器服务

  7, ejb对象调用企业bean实例

  8, 企业bea执行操作

  9, 执行组装/分解步骤然后返回

与远程接口处理相比较,本地接口的ejb方法是:

  1. 客户端调用本地对象

  2. 本地对象执行容器服务

  3. 本地对象调用企业bean实例

  4. 企业bean实例执行操作

  5. 没有其他返回步骤!!

假如你不需要从远程的客户端访问一个非凡ejb,就应该使用本地方法。

从servlet访问实体ejb不但效率低而且难于维护。使用session facade(会话外观)模式可把对实体ejb的访问封装在会话ejb中,在该会话ejb中通过使用本地接口访问实体ejb而避免过多的远程调用。

这项技术会有额外的性能和扩展方面的好处,这是因为会话和实体ejb可以使用缓存和资源池技术来进行改进。另外,由于负载的需要,会话和实体ejb可被扩展部署到其他硬件设备上,这比将servlet层复制扩展到其他硬件设备上要简单的多。

尽量粗粒度访问远程ejb

当访问远程ejb时,调用set/get方法将产生过多的网络请求,同时也导致远程接口处理的过载。为避免这种情况,可考虑将数据属性集中在一个对象中,这样通过一次对远程ejb的调用就可以传递所有数据。这项技术就是数据传输对象(data transfer object)模式。

优化sql

j2ee的架构设计工程师和开发人员通常不是sql专家或经验丰富的数据库治理员。首先应该确保sql使用了数据库提供的索引支持。在某些情况下,将数据库的索引和数据分开存放会提高性能。但要知道,增加额外的索引可以提高select性能但也会降低insert的性能。对于某些数据库,关联表之间的排序会严重影响性能。可以多向数据库治理员咨询。

扫描关注微信公众号