2012-01-27 40 views
0

我已經閱讀了關於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,這將是運氣。我也對嗎?

+0

爲什麼你需要擺在首位池?顯然你會避免每次從數據庫中讀取很多麻煩,讓操作系統,數據庫和驅動程序擔心緩存。你沒有測量池的表現嗎? – 2012-01-27 13:30:06

+0

我希望,我可以給你一個答案。這是一些生病的想法,另一個編碼。我突然遇到了這部分代碼,當我問作者時,如果它符合EJB,或者爲什麼他不使用通用標準,我就沒有真正的答案,現在它已經存在了。 – Turbokiwi 2012-01-27 15:20:32

回答

2

創建自己的線程的主要問題是,它意味着它們不在應用程序服務器的控制之下,這可能導致流氓EJB通過創建太多線程來「破壞服務器」的情況。

但是,擁有後臺線程是一件好事,因此通常應用程序服務器提供「工作管理器」以便計劃任務(使用計時器或並行線程)。

這裏有CommonJ的文章使用WebSphere提供關於如何使用線程後臺沒有打破服務器:Work Managers

下面是如何Weblogic的CommonJ文檔:The Timer and Work Manager API

雖然可能是題外話,這裏是如何春季整合與工作經理:Task Execution and Scheduling

爲了解決您的問題,我會集成一個緩存(例如EHCache),並讓它解決什麼時候從緩存中驅逐項目。

(同樣,可能是題外話,使用Spring中,可以使用緩存添加一些註釋你的代碼的問題:ehcache-spring-annotations