我已經閱讀了關於EJB的限制和幾個答案在這裏stackoverflow,但我不太確定一小段代碼,我發現在工作。這是否違反了EJB限制?
有一項服務可以根據其標識符提供有關Foos的詳細信息。
public FooResponse getFoo(FooRequest request){...};
某處的表面下是自寫入池保持最近提供的響應對象。對於每一個請求,池都會被詢問,如果有可用的條目。如果是,那麼它被用作響應,如果沒有,那麼數據庫將被詢問。當從數據庫中獲取響應時,它將存儲在池中。
池使用兩種策略來照顧它的大小。 首先,它在Map
內使用java.lang.ref.SoftReference<T>
以避免OutOfMemoryError
s。 它使用的第二件事是java.util.TimerTask
,它爲Map
中的每個條目創建,並由java.util.Timer
排定,該條目在可配置的時間量後刪除條目。
在我看來,這是違反了限制,EJB不允許創建線程(其中java.util.Timer
)。我是對的還是我在某處失去了某些東西?直到今天,這並沒有造成任何明顯的問題。你是否推薦,擺脫這個自編碼池?
另一件事是,該服務是一個無狀態SessionBean。一個容器不僅會創建其中的一個。因此,他們沒有共享同一個池,如果一個bean被問及兩次Foo
,這將是運氣。我也對嗎?
爲什麼你需要擺在首位池?顯然你會避免每次從數據庫中讀取很多麻煩,讓操作系統,數據庫和驅動程序擔心緩存。你沒有測量池的表現嗎? – 2012-01-27 13:30:06
我希望,我可以給你一個答案。這是一些生病的想法,另一個編碼。我突然遇到了這部分代碼,當我問作者時,如果它符合EJB,或者爲什麼他不使用通用標準,我就沒有真正的答案,現在它已經存在了。 – Turbokiwi 2012-01-27 15:20:32