2012-08-07 107 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

相關問題