使用EJB的实例池化如何提高性能?难道你不能像java servlet一样用线程来实现同样的性能吗?
或者,使用EJB的实例池化可能是出于另一个原因?
发布于 2009-12-24 01:24:33
我认为当bean的构建成本很高时,可以使用实例池。通过让下一个请求重用相同的bean,您不必构造另一个实例。
如果bean本身的构建成本很低,而成本是在它所做的工作中,那么实例池就不值得这么麻烦了。
发布于 2009-12-24 01:36:31
实例池不仅有帮助,因为您可以重用对象(并避免昂贵的对象创建),而且还允许应用程序。要的服务器正确地管理负载。这是个应用程序。特定于服务器,但您通常可以指定max-pool-size
、min-pool-size
、pool-resize
和timeout
。
当池达到其max-pool-size
容量时,将使用现有实例为请求提供服务,如果在预期时间范围内没有实例可用,则请求将超时。这可能会降低应用程序的服务质量,但至少不会破坏应用程序。服务器本身。这与web服务器是一样的。
关于thread-safety的几点注意事项
第4.3.13节“序列化会话Bean方法”
容器序列化对每个会话bean实例的调用。大多数容器将支持并发执行的会话bean的多个实例;但是,每个实例只能看到方法调用的序列化序列。因此,会话bean不必编码为可重入的。
根据EJB规范,对bean的特定实例的所有请求都由应用程序同步。服务器。例如,这允许无状态会话bean (SLSB)在它的一个字段中存储数据库连接。不过,SLSB的字段应该是暂时的。(可以随时销毁/重新创建bean实例。)通过同步,这个应用程序。服务器确保SLSB是线程安全的。没有应用程序的同步。服务器,开发人员应该确保SLSB是线程安全的,也就是说,它不应该有任何字段。
注意:在SLSB中很少有字段。大多数SLSB本质上是线程安全的。例如,我不建议将连接存储在字段中。最好在方法中获取一个,并在方法中尽快释放它。
发布于 2009-12-24 01:24:55
我认为它的优点与连接池类似。在池中准备好实例可以避免每次请求EJB时创建新实例的开销。
另一个好处是,通过使用最大池大小,您可以通过强制应用程序等待实例变为可用来限制失控应用程序可能造成的损害。这有助于防止写得不好的应用程序独占服务器资源。
https://stackoverflow.com/questions/1954137
复制相似问题