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

标签 java jakarta-ee ejb service-locator

我正在使用服务定位器实现,它缓存 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/

相关文章:

java,如何在不重复的情况下查找字符串中的字母数量

java - 未能执行目标 org.apache.maven.plugins :maven-compiler-plugin (default-compile) on project: Fatal error compiling: tools. 未找到 jar

jakarta-ee - 即使在 activemq 中队列不为空时,JMS 实现中的 receiveNoWait 也返回 null

java - Hibernate递归获取连接不递归获取所有子项

java - EJB事务相对于Spring事务的优势

java - 在 IntelliJ IDEA 中 CTRL+SHIFT+F9 会导致 : Cannot package file IO Error: java. io.IOException:负查找偏移

java - LibGdx - 缩放 Sprite 、相机和视口(viewport)

java - 在 Java8 标准环境下使用 Spring OAuth 的问题

jsp - 在 JSP 中包含 Servlet 内容

java - 在托管 bean 中注入(inject) Sessionscoped bean 时出现问题