| |
Java应用中的反模式开发介绍 |
|
时间: 2006-04-24 来自:天极开发 |
 |
|
EJB反模式
这些反模式涉及一些企业级的方面,例如事务和消息队列。
大型事务
那些包含了调用多个资源的复杂处理的事务可能会把其它一些等待相同资源的线程锁定一段时间。这对性能可能产生重要的影响。一般情况下,把这些事务分解成较小的片断(依赖于应用程序的需求)、或者使用替代的方法(例如用存储过程来替代长的数据库处理)是一种谨慎的做法。
JMS中队列过载(Overloading)
JMS同时提供了队列和主题目的地。队列可以作为不同类型的消息(例如二进制的地图消息或基于文本的消息)的"家"。但是如果你利用这个特性,在同一个队列中发送不同类型的消息,那么区分消息就变成了使用者的责任了。更好的解决方案是分开发送。你可以编程或者使用不同的目的地来实现这样的方案(这依赖于不同的应用程序需求)。
Web服务反模式
随着Web服务的增长,某些特定的反模式将变得很突出。
认为SOA=Web服务
面向架构的服务(SOA)这个术语经常与Web服务混淆了,但是事实上SOA的概念比Web服务的概念出现得早。SOA是为了实现组件之间的松散耦合。它提供一个软件服务,供另一个软件服务使用。但是后来,SOA与Web服务的含义变得相同了。我们要记得把SOA作为其它服务技术的基础是完全可行的。
其它的反模式
还有其它一些反模式不好分类,但是仍然值得我们注意。
硬编码的JNDI查找
Java命名和目录接口为我们提供了一条查询对象信息(例如EJB接口的位置)的便捷途径。但是JNDI查找操作一般是很昂贵的,特别是在重复执行的情况下。但是如果你缓冲了其结果,就可以获取显著的性能改善。其中一种实现方案就是使用单态(singleton)类。
但是网络不是静态的。随着网络的改变,查询也可能改变。这意味着对于网络的每种变化,程序员必须重新访问原应用程序代码,做出必要的修改,并重新编译/部署代码。其替代办法是,通过XML配置文件来提供可配置的查找,这样就可以使开发者在每次遇到网络发生改变的时候,不必重新编译代码。
没有充分利用EJB容器的特性
在我们开放企业级组件的时候,可以从两种办法中选择--使用容器提供的服务或者编写自己的服务。尽管EJB遇到了大量的替代产品(例如Spring),但是它仍然被广泛地被用于与这些框架组件协同工作。在我们使用EJB的时候,你应该试图利用容器的服务,例如群集、负载均衡、安全性、事务管理、容错和数据存储。如果你没有充分地利用容器的丰富特性,最终可能导致"重新发明轮子"(这是本文前面提到的另一种反模式)。
我相信你已经认识到反模式与设计模式的重要性相当。即使你还没有明白本文描述的某些反模式的名称,你也应该能够记住它们的特性和可能引起的问题。对这些反模式进行分类和命名所带来的好处与设计模式的分类和命名是一样的;这样做可以为软件经理、架构师、设计者和程序员提供一个通用的"词典",帮助他们认识未来的错误和维护麻烦可能的根源。
|
|
|
|
|
|
|
|