2012-08-07 104 views
0

我们有大约450个远程EJB客户端需要连接到Java EE服务器(OpenEJB 3.1.4容器)。没有HTTP服务器存在。单个Java EE服务器可以处理多少个远程EJB客户端?

我们注意到,在一些客户端联机后,服务器开始抛出javax.ejb.ConcurrentAccessTimeoutException。

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

如果该值很高,我们会减少ConcurrentAccessTimeoutExceptions,但许多客户端只是开始永远挂在那里。如果该值较低,则会引发大量ConcurrentAccessTimeoutException。

所有450个客户端在启动时建立与服务器的连接(因为连接时间太长而无法按需提供)并永久保留。

现在,还有另一个问题,最重要的是,每个客户端都会以2秒的间隔持续轮询服务器。我们可以改变这种行为,但我们必须调整架构。

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

我们可以设计任何需要的东西,但我们希望有一个更具体的目标。

回答

1

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

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

有具体的方法来获取这些信息。

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

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

它应该为您提供一些线索,以确定代码的哪些部分可能最能显示节目。要回答的问题是代码在做什么导致其他线程不得不等待。

+0

嗯,我希望能有这样的想法:“我们设法让N个客户端拥有一台服务器”......我们升级到了OpenEJB 4,开始进行更多的测试。 – 2012-08-08 18:11:59

+0

是的,没有确定的数字。第一个指标是应用程序代码本身。如果它有太多的同步,不管你投入的硬件如何,它都不能缩放。一旦被清除,第二个最重要的因素是服务器中的核心数量。如果您想离线与我联系,我很乐意看到我可以免费为您提供应用方面的建议。升级是好的,但如果应用程序不允许它将不会改变性能。 – 2012-08-08 20:26:25

相关问题