gpt4 book ai didi

java - 带缓存的 EJB 服务定位器

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:43 24 4
gpt4 key购买 nike

我正在使用服务定位器实现,它缓存 javax.naming.Context#lookup 调用的结果,并将其映射到请求的 EJB 接口(interface),因此所有后续请求(对于同一个 EJB)在第一个之后,返回缓存的实例。

我的顾虑是:

  1. 由于使用了同一个实例,所以没有利用服务多个同时请求的服务器 EJB 池具有多个 EJB(除非底层服务器逻辑以某种方式使使用 EJB 池)
  2. 无状态和有状态的 EJB 都是线程安全的,但是,再一次,每个 EJB 类只使用一个实例,并且 EJB 有 EntityManager通过@PersistenceContext 注入(inject),我认为这意味着多个线程可以使用相同的 EntityManager 实例(不仅仅是持久化上下文),这绝对不是线程安全的

您是否认为最好不要在服务定位器中使用缓存,或者我对 EJB 行为的担忧是不合理的?

最佳答案

从查找操作(通过 JNDI 服务)中得到的是一个名为 Stub 的对象,他没有固定任何特殊的 EJB 实例。

缓存后,每次调用 EJB 服务时, stub 都能够从池中选择不同的 EJB 实例(这适用于无状态);即使在集群环境中, stub 对象也能够从不同的服务器中选择一个 EJB 实例。

因此,缓存 stub 对象应该不是问题。

请注意,我在谈论无状态,我认为缓存对有状态 session bean 没有意义。

EJB 查找是一项耗时的操作,因此缓存可以提高客户端性能。


关于您的评论:

如果您在一个由多个并发线程(如 Servlet)使用的组件中使用 EntityManager,是的,您将不得不关心并发性,但 EJB 的线程模型暗示不会有多个线程同时使用同一个 EntityManager 实例同时,因此 EM 不是线程安全的事实并不重要。

What concerns me still is the fact that different EJBs are using the same injected (via @PersistenceContext) EntityManager instance

我认为对于简单的风景最好的思考方式,如果像描述的那样here :

The most common pattern in a multi-user client/server application is entitymanager-per-request. In this model, a request from the client is send to the server (where the JPA persistence layer runs), a new EntityManager is opened, and all database operations are executed in this unit of work. Once the work has been completed (and the response for the client has been prepared), the persistence context is flushed and closed, as well as the entity manager object.

这将更难检查;)

关于java - 带缓存的 EJB 服务定位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19522417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com