在条件下在无状态会话Bean中注入特定的EntityManager

时间:2012-11-01 15:51:00

标签: java-ee web-applications jboss entitymanager stateless-session-bean

我目前正在处理调用无状态会话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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

使用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,请查看使用一些@Nonbinding字段在您的自定义限定符中。

您最终只能进行一次@EJB部署。

干杯!希望这会有所帮助。