我正在使用缓存javax.naming.Context#lookup
调用结果的服务定位器实现,并将其映射到所请求的EJB接口,因此所有后续请求(对于同一个EJB)在第一个请求之后返回缓存实例。带缓存的EJB服务定位器
我的担忧是:
- 由于相同的情况下被使用,不存在 服务器EJB池这将成为多个同时发生的请求 与多个EJB(除非底层服务器的逻辑不知何故使得利用 使用EJB池的)
- 无状态和有状态EJB是线程安全的,但由于再次使用 只有每个EJB类一个实例,EJB拥有的EntityManager 通过@PersistenceContext注入,我认为MEA NS多个 线程可以使用相同的EntityManager实例(不仅仅是 持久化上下文),这绝对不是线程安全的
你认为这是最好不要在服务定位器使用缓存,或我的担心对EJB行为是不合理的?
我已经证实了这一点,使用在相同的缓存实例与并行方法调用的测试 - 尽管参考EJB(存根如你所说)是一样的,调试确认实际的EJB是不同的。我关心的仍然是不同的EJB使用相同的注入(通过@PersistenceContext)EntityManager实例。我无法确认100%这是线程安全的(因为EntityManager本身不是线程安全的),但似乎合乎逻辑的是,由于它是容器管理的,它是 - 并且可能使用代理对象的相同原理来真正的新兴市场。 – alterfox