将EJB 3会话Bean引用存储到Map中

时间:2015-10-09 17:38:01

标签: java jndi ejb-3.0 stateful-session-bean session-bean

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

  

这是将Session Bean引用存储到Map的好方法吗   每次都避免查找?还是危险的?什么样的   如果在所有应用程序中都可能遇到问题?

如果这是一个好习惯,那么我还有另外一个问题。

  

包含Map来存储引用的类是模块A。的一部分   session beans模块B1 ... Bn 的一部分。所以一旦看完我的话   将引用存储在Map中,我可以将其检索回来。同时   模块Bn 被重新部署,但A保持不变。所以现在看了之后   使用它的Map中的bean(因为它包含条目),抛出 ClassCast Exception

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

1 个答案:

答案 0 :(得分:1)

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

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