快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

Java 性能优化技巧集锦 (3)

7. 生成主键

在EJB之内生成主键有许多途径,下面分析了几种常见的办法以及它们的特点。利用数据库内建的标识机制(SQL Server的IDENTITY或Oracle的SEQUENCE)。这种方式的缺点是EJB可移植性差。由实体Bean自己计算主键值(比如做增量操作)。它的缺点是要求事务可串行化,而且速度也较慢。

利用NTP之类的时钟服务。这要求有面向特定平台的本地代码,从而把Bean固定到了特定的OS之上。另外,它还导致了这样一种可能,即在多CPU的服务器上,同一个毫秒之内生成了两个主键。借鉴Microsoft的思路,在Bean中创建一个GUID。然而,假如不求助于JNI,Java不能确定网卡的MAC地址;假如使用JNI,则程序就要依靠于特定的OS。

还有其他几种办法,但这些办法同样都有各自的局限。好像只有一个答案比较理想:结合运用RMI和JNDI。先通过RMI注册把RMI远程对象绑定到JNDI树。客户程序通过JNDI进行查找。下面是一个例子:


public class keyGenerator
extends UnicastRemoteObject implements
Remote { private static long KeyValue = System.currentTimeMillis();
public static synchronized long getKey()
throws RemoteException { return KeyValue++; }




8. 及时清除不再需要的会话

为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多会话时,假如内存容量不足,操作系统会把部分内存数据转移到磁盘,应用服务器也可能根据“最近最频繁使用”(Most Recently Used)算法把部分不活跃的会话转储到磁盘,甚至可能抛出“内存不足”非常。在大规模系统中,串行化会话的代价是很昂贵的。当会话不再需要时,应当及时调用HttpSession.invalidate()方式清除会话。HttpSession.invalidate()方式通常可以在应用的退出页面调用。

9. 在JSP页面中关闭无用的会话

对于那些无需跟踪会话状态的页面,关闭自动创建的会话可以节省一些资源。使用如下page指令:


<%@ page session="false"%>




10. Servlet与内存使用

许多开发者随意地把大量信息保存到用户会话之中。一些时候,保存在会话中的对象没有及时地被垃圾回收机制回收。从性能上看,典型的症状是用户感到系统周期性地变慢,却又不能把原因归于任何一个详细的组件。假如监视JVM的堆空间,它的表现是内存占用不正常地大起大落。解决这类内存问题主要有二种办法。第一种办法是,在所有作用范围为会话的Bean中实现HttpSessionBindingListener接口。这样,只要实现valueUnbound()方式,就可以显式地释放Bean使用的资源。

另外一种办法就是尽快地把会话作废。大多数应用服务器都有设置会话作废间隔时间的选项。另外,也可以用编程的方法调用会话的setMaxInactiveInterval()方式,该方式用来设定在作废会话之前,Servlet容器答应的客户哀求的最大间隔时间,以秒计算。

11. HTTP Keep-Alive

Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继哀求时,Keep-Alive功能避免了建立或者重新建立连接。市场上的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍然被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive功能对资源利用的影响尤其突出。

12. JDBC与Unicode

想必你已经了解一些使用JDBC时提高性能的措施,比如利用连接池、准确地选择存储过程和直接执行的SQL、从结果集删除多余的列、预先编译SQL语句,等等。除了这些显而易见的选择之外,另一个提高性能的好选择可能就是把所有的字符数据都保存为Unicode(代码页13488)。Java以Unicode形式处理所有数据,因此,数据库驱动程序不必再执行转变过程。但应该记住:假如采用这种方法,数据库会变得更大,因为每个Unicode字符需要2个字节存储空间。另外,假如有其他非Unicode的程序访问数据库,性能问题仍然会出现,因为这时数据库驱动程序仍然必须执行转变过程。

(原作者:Java Research)




返回类别: 教程
上一教程: 动态编译java程序实例
下一教程: 在Java程序中截获控制台输出

您可以阅读与"Java 性能优化技巧集锦 (3)"相关的教程:
· Java 性能优化技巧集锦 (5)
· Java 性能优化技巧集锦 (6)
· Java性能优化技巧集锦(2)
· Java性能优化技巧集锦
· Java 性能优化技巧集锦 (2)
    微笑服务 优质保证 索取样品