2

使用 EJB 的实例池如何提高性能?难道您不能仅使用 java servlet 之类的线程来实现相同的性能吗?

或者可能是出于其他原因使用 EJB 进行实例池?

4

4 回答 4

2

实例池不仅有帮助,因为您可以重复使用对象(并避免昂贵的对象创建),而且还允许应用程序。服务器正确管理负载。是应用程序。服务器特定,但您通常可以指定max-pool-sizemin-pool-sizepool-resize.timeout

当池达到其max-pool-size容量时,将使用现有实例为请求提供服务,如果在预期时间范围内没有可用实例,则会超时。这可能会降低应用程序的服务质量,但至少不会破坏应用程序。服务器本身。这与使用 Web 服务器相同。

关于线程安全的一些注意事项:

教派。4.3.13 “序列化会话 Bean 方法”

容器序列化对每个会话 bean 实例的调用。大多数容器将支持同时执行的会话 bean 的多个实例;但是,每个实例只能看到一个序列化的方法调用序列。因此,会话 bean 不必编码为可重入的。

根据 EJB 规范,对特定 bean 实例的所有请求都由应用程序同步。服务器。例如,这是为了允许无状态会话 bean (SLSB) 在其字段之一中存储数据库连接。不过,SLSB 的字段应该是瞬态的。(bean 实例可以随时销毁/重新创建。)通过同步,app. 服务器确保 SLSB 是线程安全的。没有应用程序的同步。服务器,开发者应该确保 SLSB 是线程安全的,也就是说,它应该没有字段。

注意:在 SLSB 中很少有字段。大多数 SLSB 本质上都是线程安全的。例如,我不建议将连接存储在字段中。最好在方法中获取一个,并尽快在方法中发布。

于 2009-12-23T17:36:30.813 回答
1

我认为当 bean 的构建成本很高时会使用实例池。通过让下一个请求重用同一个 bean,您不必构造另一个实例。

如果 bean 本身的构建成本很低,并且成本在于它正在做的工作,那么实例池就不值得麻烦了。

于 2009-12-23T17:24:32.713 回答
0

我认为优势类似于连接池的优势。在池中准备好实例可以避免每次请求 EJB 时创建新实例的开销。

另一个优点(取决于您如何看待它)是,通过使用最大池大小,您可以限制失控的应用程序通过强制它等待实例变得可用来造成的损害。这有助于防止编写不佳的应用程序垄断服务器资源。

于 2009-12-23T17:24:54.540 回答
0

AFAIK 的根本原因是与 servlet 的线程模型不同。在servlet的情况下,只有一个实例,许多线程可以同时在这个实例上操作。确保正确同步是开发人员的责任。

与此相反,ejb 容器只允许一个线程同时对 bean 实例进行操作(包括在后台进行必要的同步)。多亏了这一点,开发人员不必关心同步,而且规范禁止在 bean 的代码中使用同步(实际上您可以这样做,但您必须考虑性能后果)。因此,要启用并发处理,您需要将多个 bean 实例池化,以便多个线程可以同时访问它们。池的大小可以根据 bean 内部完成的工作类型进行调整。基本规则是:如果任务是 I/O 密集型的,则需要 big pool 以便在等待 i/o 响应时不浪费 cpu 时间。如果任务受 CPU 限制,则池应该与机器拥有的处理器/内核一样大。

关于 servlet 的另一个注意事项:您可以在使用 SingleThreadModel 接口时强制执行与 ejb 相同的行为。但实际上我猜这并没有多大用处。

于 2010-02-02T15:36:08.637 回答