Jakarta ee 根据条件在无状态SessionBean中注入特定的EntityManager

Jakarta ee 根据条件在无状态SessionBean中注入特定的EntityManager,jakarta-ee,web-applications,jboss,entitymanager,stateless-session-bean,Jakarta Ee,Web Applications,Jboss,Entitymanager,Stateless Session Bean,我目前正在处理调用无状态会话bean的web应用程序,以便与数据库交互。我的问题是这样的应用程序如何调用相同的会话bean,后者可以选择访问数据库必须使用哪个实体管理器 目前,我管理这种情况,启动不同的Jboss实例,监听不同的端口,在每个实例中,我部署了相同的会话Bean池,一个或多个web应用程序必须处理相同的数据库。换句话说,每个Jboss实例都包含一定数量的web应用程序、一个持久化单元(META-INF jar中的persistence.xml包含@Entity的)和会话bean池,所

我目前正在处理调用无状态会话bean的web应用程序,以便与数据库交互。我的问题是这样的应用程序如何调用相同的会话bean,后者可以选择访问数据库必须使用哪个实体管理器

目前,我管理这种情况,启动不同的Jboss实例,监听不同的端口,在每个实例中,我部署了相同的会话Bean池,一个或多个web应用程序必须处理相同的数据库。换句话说,每个Jboss实例都包含一定数量的web应用程序、一个持久化单元
(META-INF jar中的persistence.xml包含@Entity的)
和会话bean池,所有这些都在一个ear中。 主要弱点所在的地方不言而喻:我需要处理的数据库越来越不同,我必须处理的Jboss实例也越来越多,而且这主要是不可持续的,但不仅仅是出于资源原因

我的最后一个问题是:部署不同的web应用程序调用会话bean的最佳实践是什么,这些会话bean只针对注入其中的EntityManager而有所不同

提前感谢


你想要达到的目标并不十分清楚

是否使用不同的数据库将不同客户的数据分开(每个数据库具有相同的结构)?为此,Hibernate中提供了一些多租户支持(http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.html)但尚未在JPA中标准化


任何方法都可以将不同的ear放在同一个Jboss实例上(需要使用不同的web上下文名称),以减少资源消耗。(但您将失去操作系统级的进程控制,一个租户可以使用所有资源,而无需确保另一个租户获得最少的资源。)

使用CDI
@Producer
方法。我假设您知道如何区分您拥有的大量的
@PersistenceContext
,因此您可以创建一个生产者,如下所示:

// first inject all the entity managers that you have into your CDI producer
@PersistenceContext(name = "name0")
private EntitManager em0;

@PersistenceContext(name = "name1")
private EntitManager em1;

@PersistenceContext(name = "name2")
private EntitManager em2;

...

// then have your producer method with logic to chose the right EntityManager to be returned
@Produces @MyPersistenceContext
public EntityManager obtainTheRightEM(InjectionPoint caller) {
    if (hasCondition0(caller)) {
        return em0;
    } else if (hasCondition1(caller)) {
        return em1;
    } else if (hasCondition2(caller)) {
        return em2;
    } else {
        ...
    }
}
然后在
@EJB
中,将
@PersistenceContext
替换为
@Inject@MyPersistenceContext

此外,根据您的具体问题,创建
@MyPersistenceContext
限定符可能是必要的,也可能不是必要的。如果您有特定的配置值需要传递给生产商,以便决定从生产商返回哪个
EntityManager
,请在自定义限定符中使用一些
@非绑定的
字段

您可能最终只需要一个
@EJB
部署就可以了


干杯!希望这有帮助。

非常感谢您的回答。让我再解释一些。非常感谢你的回答。让我再解释一些。数据库是不同的,但具有相同的关系。我已经尝试了您概述的第二个解决方案,但不起作用。在同一个容器中(这是我第一次尝试),我遇到了会话bean冲突(调用的第一个会话bean用于以下请求,而与调用id的应用程序无关,这在会话bean池级别上是一种缺乏隔离的情况)唯一的方法是重命名会话bean接口,这是为了维护更轻的代码而避免的。因此,让我来试验第一个概述的解决方案。stfn如果EJB在不同的ear中,它们应该具有不同的全局名称,那么通过JNDI检索它们应该会得到相应的名称。