【问题标题】:Storing EJB 3 Session Bean references into Map将 EJB 3 会话 Bean 引用存储到 Map
【发布时间】:2015-10-09 17:38:00
【问题描述】:

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

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

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

包含 Map 以存储引用的类是 模块 A 的一部分。session beansModule B1 ...Bn 的一部分。所以一旦我抬头看 将引用存储在Map 中,我可以将其取回。同时 模块 Bn 已重新部署,但 A 保持原样。所以现在抬头看 Map 中的 bean(因为它包含条目)使用它, ClassCast Exception 被抛出。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我没有发布日志,因为它发生在很久以前,从那以后我没有使用缓存。那么这是否意味着如果我在我的字段上使用 @EJB 注释,缓存这些引用只是多余的?是的,当我不使用缓存时,重新加载模块后,bean 的新循环可以正常工作。您的类加载器理论似乎令人信服,但 ClassCastException 在这些情况下最合适。或者可能是在重新加载一个模块时,它的引用池被与之维护的应用程序服务器擦除并创建一个新的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多