【发布时间】:2011-02-22 09:29:22
【问题描述】:
我需要创建一个缓存来存储需要从数据库更新的某些值。由于这个缓存需要是单数的,某种单例实现似乎是合适的。
问题是这个缓存还需要通过 EJB 访问数据库,因为缓存存在于上下文之外(是的,我期待 EJB3.1 中的 @singleton 注解) )。
显而易见的解决方案是将 EJB 作为参数传递到缓存中,但是在上下文之外传递 EJB 感觉是错误的,尽管我不能说出原因。这是公认的做法吗?
【问题讨论】:
我需要创建一个缓存来存储需要从数据库更新的某些值。由于这个缓存需要是单数的,某种单例实现似乎是合适的。
问题是这个缓存还需要通过 EJB 访问数据库,因为缓存存在于上下文之外(是的,我期待 EJB3.1 中的 @singleton 注解) )。
显而易见的解决方案是将 EJB 作为参数传递到缓存中,但是在上下文之外传递 EJB 感觉是错误的,尽管我不能说出原因。这是公认的做法吗?
【问题讨论】:
请注意,您通常不会在“上下文之外”传递 EJB 本身。您通常传递的是“存根”。这个存根可以作为任何其他普通对象引用传递。对它的任何调用都会重定向回 EJB 容器中的实际 bean 实例。
因此,如果您在 web 模块中有一个缓存,有一个注入 EJB 的支持 bean(或执行 JNDI 查找)并将该引用传递给(静态)缓存,那么我看不出根本问题用那个。
出于所有意图和目的,@Singleton 注释确实是为这样的事情而制作的。希望你能尽快使用它;)
【讨论】:
EJB 的主要优势在于容器内部。如果您将其传递到外面,您将失去容器提供的所有优势。为什么不在 EJB 中创建一个返回所需数据的方法。例如,您可以执行 JNDI 查找并调用该方法。通过这种方式,EJB 将留在容器中,您将获得数据。
【讨论】: