0

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

目前我管理这种情况,启动不同的 Jboss 实例,监听不同的端口,并且在每个实例中我部署了相同的会话 Bean 池,并且一个或多个 Web 应用程序必须处理相同的数据库。换句话说,每个 Jboss 实例都包含一定数量的 Web 应用程序、一个持久性单元(persistence.xml in META-INF jar containing the @Entity's)和会话 bean 池,它们都在一个耳朵内。主要弱点在哪里是不言而喻的:我需要处理更多不同的数据库,我必须维护尽可能多的 Jboss 实例,它主要是不可持续的,但不仅是因为资源原因。

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

提前致谢

stfn

4

2 回答 2

1

使用 CDI@Producer方法执行此操作。我假设您知道如何区分@PersistenceContext您拥有的众多 s,因此您制作了一个生产者,如下所示:

// 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的 s 中替换@PersistenceContext@Inject @MyPersistenceContext

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

您最终可能会因为只有一个@EJB部署而侥幸成功。

干杯! 希望这可以帮助。

于 2012-11-02T13:25:33.817 回答
0

你想要达到的目标并不是很清楚......

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

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

于 2012-11-02T10:08:23.557 回答