JBoss EAP 6 中的 EJB 池 - 为 max-pool-size 设置一个非常大的值是否有任何缺点?

EJB pooling in JBoss EAP 6 - Are there any downsides to just setting a really large value for max-pool-size?

我们有一个大型知识管理应用程序,我们正在从 JBoss EAP 4.3 迁移到 EAP 6.4。我们遇到了一些问题,并行 MDB 驱动的进程失败(错误消息在 this question 中引用),可追溯到 SLSB 池耗尽。 MDB 线程正在请求一个特定的无状态会话 bean 三层深度(以打开新事务),因此 10 个并发进程足以耗尽池并导致死锁,默认值 max-pool-size 为 20。

解决方案是将该特定 SLSB 分配给它自己的池并确保 max-pool-size 设置得足够大,以便始终有足够的 bean 实例可用(在我们的例子中是 75 个,因为罪魁祸首 MDB 进程是有限的到 25 个实例本身)。毫无疑问,我们会在我们的应用程序中发现许多其他情况,这些情况可能需要或至少受益于设置类似的自定义池大小。

重点是,JBoss EAP 中 MDB 和 SLSB 最大池大小的默认值 - 每个 bean 20 个实例 - 似乎低得离谱。我想做一些分析,看看在应用程序的典型使用过程中我们有多少 EJB 实例在运行,这样我就可以知道我们需要允许的池大小。

至于20的max-poo-size,真的很难想出一个默认值。如果将其设置为 100,则单核系统上的用户可以轻松压倒 CPU。它归结为有多少个内核可用、MDB 工作负载是什么样的以及应用程序中还有多少其他内容。

如果您有 32 个内核可用,应用程序中没有其他任何事情发生,并且在 MDB 处理期间完成的工作非常小,那么 20 个内核可能太小了。

MDB 将始终被池化,无状态会话 bean 也是如此。

您可以将池最大值设置为较高的值,这不会造成任何伤害。请记住,对于 MDB,激活需要 JMS 会话。默认会话数为 15。因此对于 MDB,您需要匹配会话数和实例池大小以获得所需数量的激活 MDB。会话数在 MDB 激活部署规范中配置。