【正确答案】
【答案解析】当使用J2EE开发Web应用程序时,若只是考虑功能实现,一般都不存在什么问题,但由于Web应用的分布式特性,在很多特定的场合下,并发数据量会变得非常大,如何能够保证此时系统还能够高效地运转,而且能够快速地响应用户的请求呢?
下面介绍一些常用的方法。
1)优化设计,例如,小心使用继承。继承会导致递归,同时由于父类的构造器将会被遍历,继承嵌套得过深,会产生巨大的创建开销,因此推荐尽量使用组合方式来代替继承方式。除此之外,还有很多其他的方法:封装和重用常用的业务方法以及相关工具,避免在其他类中重复编写;简化类结构;面向接口编程;尽量使用主要类型;避免对象的过度使用,例如,不要为了使用一个方法就创建对象,应尽可能地使用静态方法或是使用将业务组件实例化后共享的方法等。
2)尽可能使用数据库连接池。建立数据库的连接是一项必须但又非常耗时的工作,如果频繁地建立与数据库的连接将会导致系统性能的急剧下降。因此,在实际开发系统时,经常使用数据库连接池来提高系统性能。具体而言,就是使应用服务器维护着数据库连接池,这样就不需要在每个事务处理开始时就创建一个连接了。此外,由于PreparedStatement有缓存功能,这使其具有较高的效率,因此,在使用JDBC的方式访问数据库时,应尽可能使用PreparedStatement。
3)给Web容器配置合理的线程数量来处理客户端的HTTP请求。一般而言,最小的线程数量设置为容器处理请求的平均数(平均负载),最大值设置为系统在高峰期处理的请求数,同时Web容器中线程的个数最好不要多于Web服务器中线程的个数。
4)根据实际情况设置Java虚拟机中堆空间的大小。合理地设置堆空间的大小能够使得垃圾回收器运行的时间间隔被控制在一个合理的范围内,从而减少许多不必要的系统开销。具体设置堆空间大小的方法可参考专用资料。
5)使用框架(例如Hibernate)来提高系统的效率。
6)把一些经常被访问的Servlet或JSP缓存起来,能够减少响应时间和提高系统的性能。但需要注意的是,缓存并非越多越好,无规则地使用缓存也可能会导致系统的崩溃。
7)当在系统中使用EJB时,由于对EJB的调用是采用对象请求代理(Object Request Broker,ORB)的方式来完成,而ORB使用了线程来处理对EJB的请求,因此,应当合理配置线程池的大小以便它能够在平均负载和高峰期都能够很好地处理EJB的请求。
8)优化I/O性能。I/O使用不当将会造成资源竞争,降低系统性能。所以,在实际应用时,尽可能少使用System.out打印调试信息,推荐使用缓冲。
9)优化查询。在模型设计时就应考虑冗余相对不会变化的数据,如果设计大数据量,最好能够考虑分区设计。
10)对session进行合理管理与设置。根据实际情况对内存中可能存在的session的个数设置一个合适的值。注意:尽量减少session的大小,以降低其对内存的使用。而且,除非是在必须的情况下,否则尽量不要启用对session的持久化。同时,通过对session设置一个合理的超时时间来回收较长时间不使用的session,也可以有效地提高系统的效率。