目前,我正在应用程序中使用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
发布于 2015-10-11 17:12:12
缓存对无状态和单例会话bean查找的引用是很好的。这基本上就是@EJB注释在字段中使用它时所做的工作。(显然,它不适用于有状态会话bean,它为每次查找返回一个不同的EJB引用。)
您没有提到应用服务器,也没有为ClassCastException提供堆栈跟踪,但是重新启动模块很可能会为应用程序的新实例创建一个新的类加载器,这意味着您缓存的EJB引用现在是不兼容的。我猜想即使您没有缓存结果,也会发生类似的ClassCastException,但是您的应用服务器可能有解决办法。在重新启动EJB模块时,最好重新启动所有调用模块(或整个应用程序)。
https://stackoverflow.com/questions/33044162
复制相似问题