我们有一个庞大的知识管理应用程序,我们正在从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实例,所以我可以知道我们需要允许哪些池大小。
max-pool-size
值为20的理由是什么?max-pool-size
会有什么危害
某些人默认slsb-strict-max-pool
和mdb-strict-max-pool
任意大的价值?我认识到这可能会增加峰值
应用程序在实例化时使用的内存分配
很多EJB实例,但由于EJB只是实例化并按需添加到池中,它与不使用池的替代方法有何不同? (对于上下文,我进行了快速审核,并在我们的应用程序中计算了34个MDB和775个SLSB。)max-pool-size
与应用程序所需的预期EJB实例数量紧密匹配,或者我可以在所有内容上设置一个大的max-pool-size
值并留在那里?答案 0 :(得分:1)
对于20的max-poo-size
,很难提出默认值。如果将其设置为100,那么单核系统上的用户可能很容易淹没CPU。它归结为可用的内核数量,MDB工作负载的样子以及应用程序中还有多少其他内容。
如果您有32个可用核心,则应用程序中没有其他任何内容,并且在MDB处理期间完成的工作非常少,那么20个池可能太小。
将永远汇集MDB,无状态会话bean也是如此。
您可以将游泳池最大值设置为较高的值,这不会对任何事情造成伤害。请记住,对于MDB,激活需要JMS会话。默认会话数为15.因此,对于MDB,您需要匹配会话数和实例池大小,以获得所需数量的激活MDB。会话数在MDB激活部署规范中配置。