2015-10-09 32 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