gpt4 book ai didi

java - 管理多个数据库连接

转载 作者:搜寻专家 更新时间:2023-10-30 20:55:01 25 4
gpt4 key购买 nike

这几天一直在为这个问题苦苦挣扎,

场景如下:我有几个数据库,每个客户一个,所有数据库都具有相同的结构(相同的表和列),所以我的应用程序需要在运行时决定它需要连接哪个。我正在使用 JPA2、EclipseLink 和 EJB3。

我的第一次尝试是实现一个自定义的 EntityManager,其中包含在正确的数据库上执行操作的所有逻辑,然后我将这个 EntityManager 配置为无状态 EBJ,以便可以使用 @EBJ 注释注入(inject)它(如在此链接中进行了描述:http://www.hostettler.net/blog/2012/11/20/multi-tenancy/)。我无法让它工作,因为它在尝试注入(inject) EntityManager 时抛出异常。

所以我决定尝试其他方法,我创建了 EntityManagerFactory 并通过了JTA_DATASOURCE 到它(在运行时决定使用哪个之后),这样它就可以连接到正确的数据库。

代码如下:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestEntDAO {

private EntityManager em;
private EntityManagerFactory emf;

@PostConstruct
public void init() {
em = getEntityManager();
}

public EntityManager getEntityManager() {
Map props = new HashMap();
props.put(PersistenceUnitProperties.TRANSACTION_TYPE, "JTA");
props.put(PersistenceUnitProperties.JTA_DATASOURCE, dataSourceName());
emf = Persistence.createEntityManagerFactory("testePU", props);
em = emf.createEntityManager();
return em;
}

public String dataSourceName(){
if(someCondition){
return "db1";
}else{
return "db2";
}
}
}

这很完美,唯一的问题是交易不是由容器,所以我必须明确标记事务的边界(调用 begin() 和犯罪())。我可以只使用 @PersistenceContext 注释来让它工作,但后来我不会有 EntityManagerFactory 来传递数据源。

有谁知道使用容器管理事务 (CMT) 的方法并且仍然能够传递数据源?

最佳答案

也许尝试定义 3 个数据源和 3 个持久化单元。

<persistence-unit name="PU1">
<jta-data-source>jdbc/DS1</jta-data-source>
...
</persistence-unit>
<persistence-unit name="PU2">
<jta-data-source>jdbc/DS2</jta-data-source>
...
</persistence-unit>
<persistence-unit name="PU3">
<jta-data-source>jdbc/DS3</jta-data-source>
...
</persistence-unit>

然后从您想要的任何持久性单元中注入(inject)实体管理器。

@PersistenceContext(unitName = "PU2")
EntityManager em;

这应该可行,尽管我没有测试它。

关于java - 管理多个数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com