2

目前我正在EJB3.0 session beans我的应用程序中使用。通常我使用jndi name并调用相关方法查找bean。但最近有人建议我将这些引用存储在 aMap而不是一次又一次地查找。

这是存储Session Bean引用Map 以避免每次查找的好习惯吗?或者它是危险的?如果在所有应用程序中可能会遇到什么样的问题?

如果这是一个好的做法,那么我还有另一个问题。

包含Map存储引用的类是模块 Asession beans的一部分。 而是模块 B1 ...Bn的一部分。因此,当我将参考存储在 中查找后Map,我可以将其取回。与此同时, 模块 Bn被重新部署,但模块 A 保持原样。所以现在在使用它从 Map (因为它包含条目)查找 bean 之后,ClassCast Exception被抛出。

这是什么原因,我该如何避免?我正在使用 JBOSS 应用程序服务器 - jboss 5.1.0.GA

4

1 回答 1

1

缓存对无状态和单例会话 bean 查找的引用很好。这基本上就是@EJB当您在字段上使用注释时所做的。(它显然不适用于有状态会话 bean,它为每次查找返回一个不同的 EJB 引用。)

您没有提及您的应用程序服务器,也没有提供 ClassCastException 的堆栈跟踪,但是重新启动模块很可能会为应用程序的新实例创建一个新的类加载器,这意味着您缓存的 EJB 引用现在是不相容。即使您没有缓存结果,我也会猜到类似的 ClassCastException 会发生,但也许您的应用程序服务器有一个解决方法。重新启动 EJB 模块时,最好重新启动所有调用者模块(或仅重新启动整个应用程序)。

于 2015-10-11T17:12:12.280 回答