2009-12-23 35 views

回答

1

我認爲實例池是在bean的構建成本很高時使用的。通過讓下一個請求重用相同的bean,您不必構造另一個實例。

如果bean本身構建起來便宜,並且花費在其工作中,那麼實例池並不值得花費麻煩。

+0

嗯,在這種情況下,你不能在該實例中運行多個線程嗎?會導致線程安全問題嗎? –

+0

@seibzhen - 我不認爲允許EJB在服務器容器內創建線程。 –

+0

對不起,我的意思是實現EJB容器創建線程,而不是實際的EJB實現。 –

0

我認爲它的優點與連接池的優點相似。在池中準備好實例可避免每次請求EJB時創建新實例的開銷。

另一個優點是,通過使用最大池大小,可以限制失控應用程序可以通過強制它等待實例變爲可用而造成的損害,這取決於您如何看待它。這可以幫助防止寫得不好的應用程序壟斷服務器資源。

2

實例池不僅可以幫助您,因爲您可以重複使用對象(並避免昂貴的對象創建),但也允許應用程序。服務器到正確管理負載。這是應用程序。服務器特定,但通常可以指定max-pool-sizemin-pool-sizepool-resizetimeout

當池達到其容量時,使用現有實例提供請求,如果在預期時間範圍內沒有實例可用,則會超時。這可能會降低應用程序的服務質量,但至少不會導致應用程序崩潰。服務器本身。這與Web服務器相同。

的幾個注意事項線程安全

教。 4.3.13「序列化會話Bean方法」

容器序列化對每個會話bean實例的調用。大多數容器將支持許多同時執行的會話bean實例;但是,每個實例只能看到方法調用的序列化的 序列。因此,會話bean不必被編碼爲可重入。

根據EJB規範,應用程序會同步所有對bean特定實例的請求。服務器。例如,這允許無狀態會話bean(SLSB)在其一個字段中存儲數據庫連接。儘管如此,SLSB的領域應該是短暫的。 (bean實例可以隨時銷燬/重新創建。)通過同步,應用程序。服務器確保SLSB是線程安全的。沒有應用程序的同步。服務器,開發人員應確保SLSB是線程安全的,也就是說,它應該沒有字段。

注意:在SLSB中很少有字段。大多數SLSB本質上是線程安全的。例如,我不建議在字段中存儲連接。更好地獲取方法中的一個,並在方法中儘快釋放它。

0

AFAIK的根本原因是不同的線程模型相比,這個servlet的一個。在servlet的情況下,只有一個實例,許多線程可以同時在這個實例上運行。開發者有責任確保適當的同步。

與此相反,ejb容器只允許一個線程同時在bean實例上運行(包括在後臺進行必要的同步)。由於這一點,開發人員不必關心同步,而且在規範中禁止使用同步代碼(實際上你可以做到這一點,但你必須考慮性能後果)。 所以要啓用併發處理,您需要共享多個bean實例,以便多個線程可以同時訪問它們。根據bean內部完成的工作類型,可以調整池的大小。基本規則是:如果任務是I/O綁定的,則需要大池,以便在等待I/O響應時不會浪費CPU時間。如果任務受CPU限制,則池應該與機器具有的處理器/內核一樣大。但是調整應該基於測量。

有關servlet的更多注意事項:使用SingleThreadModel接口時,您可以強制執行與ejb相同的行爲。但事實上,這並沒有太多的使用,我猜。