0

我们有一种情况,大约有 450 个远程 EJB 客户端需要连接到 Java EE 服务器(OpenEJB 3.1.4 容器)。不存在 HTTP 服务器。

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

文档说这是由于尝试在方法中同时访问有状态会话 bean 或单例 bean 时超时引起的。我们实际上都使用了两者,但很难弄清楚超时的好值可能是多少。

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

它应该为您提供一些线索,让您了解代码的哪些区域可能最阻碍演出。要回答的问题是导致其他线程必须等待的代码是什么。

于 2012-08-08T04:51:25.003 回答