2009-09-30 75 views
3

我正在使用JCS來存儲應該由多個EJB共享的ldap搜索結果。我創建了一個singleton類來僅初始化JCS,但由於EJB的類加載器,它已用自己的副本多次初始化。所以搜索資源不共享。如何跨多個EJB共享Java緩存系統(JCS)資源

你們如何解決問題,你需要跨多個bean共享緩存? 我正在尋找JVM中的緩存。 (不是遠程例如memcached等)。

Glassfish被用作應用服務器。

+0

你能告訴我們更多關於你的EJB的打包和你的類加載器的問題嗎? – 2009-10-02 01:06:50

回答

2

我還沒有能夠測試它,但我認爲應用程序開發指南的"Circumventing Class Loader Isolation"章節中介紹的用於所使用的Glassfish版本的其中一種技術可以解決您的問題。


短版,至少有效期爲2-3-4版本:使用通用類加載器(究竟這個共同的類加載器確實和它的其他類加載器的關係在同一手冊解釋)。有幾種方法可以做到這一點:

  • 副本罐子域目錄/lib目錄
  • 或JAR複製到作爲安裝/lib目錄
  • 或運行asadmin add-library --type common /path/to/your.jar(只會工作在版本4 iirc中)

有幾個關於SO的問題與「循環加載程序隔離」(僅使用該搜索術語)有關,請查看示例和更多討論。

1

簡而言之,單身人士可能會「活」到你的緩存實現類所在的地方,因爲這是「擁有」類的層次結構中的類加載器。

因此,如果每個EJB分別部署,並擁有自己的高速緩存lib jar副本,它們將分別獲得自己的副本。

如果您的bean部署在複合EAR中,共享單個lib jar實例,那麼該緩存將在EAR中的bean之間共享。

如果您完全從部署中刪除lib並將其放在容器外(例如$ DOMAIN/lib/ext),那麼該緩存將由域中的所有(EJB,EAR,WAR等)共享)。

+0

感謝您的回答。 JCS Cache是​​跨多個EJB和綁定組件(OpenESB)共享的公共庫的一部分,但我想$ DOMAIN/lib應該解決這些問題。 – rjoshi 2009-10-02 02:17:04