改善J2EE程序性能的一些方法

 

一个j2ee项目的性能会受多方面的影响,比较常见的一个是web前台的大量访问,web前台的程序要能够处理高并 发量的请求,但要达到这种要求了一般从编码角度来考虑起的作用不太大,我们通常的一个web项目使用MVC模式的一些开源架构作为基础,使前台的程序结构 比较明了,在有些地方使用LazyLoading的设计模式,一般也就仅此而已,跟多的改善性能的措施一是垂直方式(如增加机器的硬件,设定一些JVM和 服务器的优化配置),二是水平方式(采用群集的方式,在多台机器上部署web前台的程序,利用负载均衡的策略将用户的请求发送到不同的服务器上),通过上 述方式来改善web前台的性能(实际上是用户体验)。

我们在这所说的web前台指的是一些页 面相应的程序和一些简单的逻辑处理,不包含真正进行业务逻辑处理的功能,当然你可以将所有的一切放在一个项目中,部署到一台服务器上,完全没有问题(除了 有些功能的完成不是你所写的而是你调用别的程序来得到结果) ,但在一个大型的j2ee项目中通常是不会由一个程序项目完成的,在这样的项目中,前台的程 序相应用户的请求后,将一些信息封装好后去调用中间件程序或后台程序,那这些中间件和后台一般会单独作为一个项目部署在其他的机器上,之所以要把它们分开 部署,就是可能一个VM的处理效能不够,而采用分布式处理的方式,采用分布式处理可以提升效率,但也带来了一些问题,如安全性问题,分布式事务处理的问题 等等,好在这些问题一般我们在写程序是不用考虑太多,相应的分布式处理框架一般都提供解决的方法,但仍有一些是我们可以通过程序来改善的,比如在安全性问 题上,我们在传输信息是可以加上自己的密匙(比如一些md5或是base64的字符串,传输的信息也可以先转换成md5或是base64再传输,当然这些 对应的是些字符串的信息)。虽然通过分布式处理方式可以提高单个VM的效率,但它要通过网络来相互调用,而这种远程的调用要比VM内部的方法调用要慢很多 (好几个数量级),所有我们尽量减少网络调用的次数,比如运用VO模式,将所有的状态数据包装成一个可序列化的对象来传输或读取,从而减少远程调用的次 数。另一方面在分布式处理的方式中如xmlrpc,web services中我们可以多考虑用异步调用的方式来取代同步调用的方式,这也可以改善调用方的性能(多是web前台),但有些情况是不能用异步方式调用 的,比如调用方等着返回的结果来进行下步的实时操作,但有些比如调用方调用发送邮件的中间件就可以用异步的方法了。

在 中间件或后台程序中不可避免的要同数据库打交道,持久层的设计也是影响一个j2ee项目的重要原因,这中间有两方面,一个是同数据库的连接是个开销比较大 的地方,在这里我们大多用数据源来连接程序和数据库;还有一个就是操作数据库的代码,这个方面的东西要说的很多,现在一般是用ORM来做数据持久方面的工 作,我们将在以后单独讲讲。除了持久层方面,中间件部分还有很多别的地方要注意的。一个就是我们在中间件上调用业务逻辑处理这部分,一个用户调用一个针对 他的业务逻辑处理对象,如果用普通的类来做,中间件的负荷也就比较大了,在这里我们可以用Session facade模式,即用Session bean来封装业务逻辑部分,用户的请求到达中间件后有一个相对应的session bean来处理(多为简单的无状态的session bean) ,之所以这么做是利用了ejb容器对session bean的优化,另一方面在session bean中跨数据库的事务也很好维持(也是由ejb容器来负责)。对应于session facade,还有message facade,它是利用消息驱动bean和jms来处理一些消息和队列方面的问题,它也可以是异步的方式(这方面我还没玩过,等有些经验后再总结出来)。 除了采用session bean来处理用户的逻辑请求,在中间件中我们还可以采用Service Locator模式来提高中间件的性能,说白了,该模式就是采用缓存机制来响应前台的调用,多在实际中使用一个static 的hashmap来做为缓存,存储一些如EJBHOME,JMS连接工厂,数据源等,从而减少大量的jndi查找和远程调用的次数。

以上就是我用过的一些改善j2ee程序性能的方法,简单好用

你可能感兴趣的:(设计模式,bean,Web,中间件,jms)