我目前正在处理调用无状态会话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
答案 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
部署。
干杯!希望这会有所帮助。