对于q两U应用,通常W一考虑是性能要最优,性能是我们选择IT技术的主要依据之一?/p>
到最大化的性能Q对于JavapȝQ以前通常的作法是使用对象池,q样节约对象生成时的性能开销Q也是说系l启动时Q预先生成一定数目的对象实例在内存(sh)Q需要用时Q从对象池中取出实例Q用完,归还对象池,对于有状态的应用Q可以用相x(chng)久化QpersistenceQ策略来保存状态?/p>
下一步,如何q行讉K对象池将是非帔R要,java的多U程技术ؓ(f)我们提供?jin)实现可能,U程的创建销毁也是可能非常耗时的,那么Q无疑象使用对象池一P我们必须使用U程池来实现多线Eƈ行计的最优化?/p>
使用U程池和对象池,每次客户端请求发生一ơ就从线E池中借用一个线E,处理完这个请求就线E返回线E池Q同P使用U程快速的讉K对象Q对象也是从对象池中借用Q用完就q回对象池?整个q样的架构设计在性能上是最优的?/p>
有了(jin)性能保证Q安全机制、事务机制、集?cluster)技术也是选择IT技术的主要依据?/p>
J2EE是q样一个实Cq多U考量的综合标准框架系l,在具体用中Q也许我们对所有这些考量的要求ƈ不都一样重视,比如Q如果纯_追求性能是第一Q可以忽视事务机Ӟ那么Q完整的J2EE技术也许就q不适合你?/p>
那么我们先看看J2EE是如何从性能上保证我们的应用pȝ以最快速度q行的,也就是说J2EE中必然应该有上述U程池和对象池的实现技术,servlet实际是基于线E池的更好的U程容器QEJB是基于对象池的更好的对象容器?/p>
看看Servler的架构图Q?/p>
当client1发生h时servlet容器?x)从U程池中分配一个线E给q个request.
再看看EJB的架构图Q?/p>
instance Pool作ؓ(f)一个对象实例池Q维持着EJB实例Q当然这个对象池是用生命周期的,单的?EJB=对象?q程对象?/p>
但是QEJBq整合了(jin)相当的其它增强功能,如安?事务机制{,q些对于一般应用都是必需的,当然你还必须Ҏ(gu)你的需要来选择是否使用J2EEQ如果你的应用对安全 事务机制没有要求Q直接用线E池和对象池技术肯定获得最好的性能?/p>
所以,Ҏ(gu)Servler和EJB的原理,我们已经可以规划我们的应用,什么可以放在servletQ或什么需要放在EJB中实玎ͼ(x)
U程的本质决定了(jin)servlet只适合一些轻量的应用Q如分析单XML文档, 通过JDBC讉K数据源,使用JMS或JavaMail处理单的信息MessageQ或使用JTS/JTA处理单的事务机制Q注意这些用词都??的,一旦复杂了(jin)Q就要用EJB?jin)?/p>
下面从客L(fng)和服务器端两个方面来具体考量q两个技术的使用Q这里的客户端不一定是指最l客L(fng)Q因为J2EE是多层结构,中间层可能在多个服务器上实现Q如果一个服务器上的服务是供另外一个服务器上的应用讉K的,那么后者我们也UCؓ(f)客户端?/p>
Ҏ(gu)应用的复杂程度和要求不同Q分下列情况Q?/p>
1.在WEB层可以实现的一些应?/p>
如果你的pȝ没有很复杂的事务处理Q或讉K很多企业原有的资源,那么可以借助javabeanq样的一些Help性质的类来实C的应用,但是Q这L(fng)Ҏ(gu)不是最q净clean, 最有效efficient, 或最有扩展性的scalable?/p>
否则Q将所有核?j)计放|入EJB中?/p>
2.所有的复杂商务计算核心(j)都在EJB中完?/p>
如果你的客户端和服务器端之间有防火墙Q那么目前能够无障碍通过防火墙的协议只有Http?Web Service也是Zhttp是q个道理)Q既然用http?jin),而Servlet是基于Http协议的,那么需要通过servlet来访问EJBQ这是我们最普遍的应用情c(din)?/p>
但是Q如果你的客L(fng)和服务器端可以放|在一个网l内Q之间没有防火墙Q那么就不必使用ServletQ直接用Java调用RMI来访问EJBQ这h能是最好的Q这时的Servlet大概只有用于控制Jsp的页面的输出?MVC模式中的控制作用)?/p>
如果是非java客户端,可以通过CORBAlg来访问EJB?/p>
3.如果你的应用寚w度要求很高Q要求非常快Q对于事务处理等斚w几乎无要?/p>
直接使用J2SEQ加上线E池和对象池技术,会(x)使你的javapȝ性能发挥极致。Jakarta.Apache.org有这两种技术的源码Q线E池可以从Servlet容器Tomcat的源码中发现?/p>