2015-10-09 30 views
2

目前我在我的應用程序中使用EJB3.0 session beans。通常我使用jndi name來查找bean並調用相關的方法。但最近我建議將這些參考文獻存儲在Map中,而不是一次又一次地查找。將EJB 3 Session Bean參考存儲到映射中

這是Session Bean引用存儲到Map 避免其查找每次一個好的做法?或者它是危險的?什麼樣的 問題,如果在所有的應用程序可能不得不遇到?

如果這是一個很好的做法,那麼我有另一個擔心。包含Map存儲引用

類是模塊A.的一部分。雖然 session beans模塊B1 ... BN的一部分。所以一旦查找時我 存儲參考Map,我可以找回它。在此期間, 模塊Bn被重新部署,但A保持原樣。所以現在在查找 豆從Map(因爲它包含條目)使用它,ClassCast Exception被拋出。

這是什麼原因,我該如何避免? 我使用JBoss應用服務器 - JBoss的5.1.0.GA

回答

1

這是罰款緩存引用無國籍和辛格爾頓會話bean查找。這基本上是@EJB批註在字段上使用它時所做的。 (它顯然不適用於有狀態會話Bean,它爲每個查找返回不同的EJB引用。)

您沒有提及您的應用程序服務器,也未提供ClassCastException的堆棧跟蹤,但重新啓動模塊很可能會爲應用程序的新實例創建一個新的類加載器,這意味着您緩存的EJB引用現在不兼容。即使你沒有緩存結果,我也會猜想類似的ClassCastException會發生,但是也許你的應用服務器有一個解決方法。在重新啓動EJB模塊時最好重新啓動所有調用者模塊(或者只是整個應用程序)。

+0

是的,我沒有發佈日誌,因爲它發生在很長的一段時間,從那時起我沒有使用緩存。那麼這是否意味着如果我在我的字段上使用**'@ EJB' **註釋,它只是多餘的來緩存這些引用?是的,當我沒有使用緩存,重新加載模塊新鮮的循環的豆作品沒有任何問題。你的類加載器理論看起來很有說服力,但在這些情況下最適合**'ClassCastException' **。或者可能在重新加載模塊時,其引用池將被應用程序服務器所維護並刪除,並創建新的引用 – SacJn