单个Java EE服务器可以处理多少个远程EJB客户端?

时间:2012-08-07 17:46:17

标签: java-ee numbers ejb capacity

我们遇到大约450个远程EJB客户端需要连接到Java EE服务器(OpenEJB 3.1.4容器)的情况。没有HTTP服务器。

我们注意到,在许多客户端上线后,服务器开始抛出javax.ejb.ConcurrentAccessTimeoutException。

文档说它是在尝试同时访问方法中的有状态会话bean或单例bean时由超时引起的。我们实际上使用了两者,但很难弄清楚超时的好处是什么。

如果值很高,我们会得到更少的ConcurrentAccessTimeoutExceptions,但很多客户端才会开始永远挂起。如果值很低,则会抛出大量ConcurrentAccessTimeoutExceptions。

所有450个客户端在启动时建立与服务器的连接(因为连接时间太长,无法按需进行)并永久维护。

现在,还有另外一个问题。每个客户端不断以2秒的间隔轮询服务器。我们可以改变这种行为,但我们必须调整架构。

是否有研究或任何有许多客户经验的人在那里连接到Java EE服务器?

我们可以根据需要进行设计,但我们希望有更具体的目标。

1 个答案:

答案 0 :(得分:1)

在StackOverflow上回答可能是一个棘手的问题,因为最终这是一个与EJB无关的线程问题。问题或多或少与“我有一个在同步块中执行的代码,我应该使用多少个线程并保持快速的东西?”这个问题相同。

真正的问题是synchronized块中的代码是做什么的? (即@Stateful的{​​{1}} bean或@Lock(WRITE)方法。目标是消除同步需求或至少缩短同步代码运行的持续时间。

有一些具体方法可以获取此信息。

一种技术是将超时增加到接近无穷大,然后当事情挂起时,在命令行上发出@Singleton,其中12345是服务器的进程ID。这将导致将线程转储吐出到服务器的System.out上。

该输出将准确显示每个线程正在执行的操作以及我们当前调用的方法以及该线程是否处于等待状态。您需要多次选择该输出。

它应该为您提供一些线索,以确定代码的哪些区域可能最大程度地阻碍了节目。要回答的问题是代码正在做什么导致其他线程必须等待。