Java 管理多个数据库连接
我已经为这个问题挣扎了好几天 以下是场景: 我有几个数据库,每个客户都有一个数据库,所有数据库都具有相同的功能 结构(相同的表和列),因此我的应用程序需要在运行时决定需要连接哪个表和列。我正在使用JPA2、EclipseLink和EJB3 我的第一次尝试是使用所有逻辑实现一个定制EntityManager,以便在正确的数据库上执行操作,然后我将该EntityManager配置为一个无状态EBJ,以便可以将其注入@EBJ注释(如此链接所述:)。我不能让它工作,因为它在尝试注入EntityManager时抛出了一个异常 所以我决定尝试其他方法,我创建了EntityManagerFactory并通过了测试 JTA_数据源连接到它(在运行时决定使用哪个数据源之后),以便它可以连接到 正确的数据库 代码如下:Java 管理多个数据库连接,java,database,ejb,eclipselink,entitymanager,Java,Database,Ejb,Eclipselink,Entitymanager,我已经为这个问题挣扎了好几天 以下是场景: 我有几个数据库,每个客户都有一个数据库,所有数据库都具有相同的功能 结构(相同的表和列),因此我的应用程序需要在运行时决定需要连接哪个表和列。我正在使用JPA2、EclipseLink和EJB3 我的第一次尝试是使用所有逻辑实现一个定制EntityManager,以便在正确的数据库上执行操作,然后我将该EntityManager配置为一个无状态EBJ,以便可以将其注入@EBJ注释(如此链接所述:)。我不能让它工作,因为它在尝试注入EntityManag
@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>
虽然我没有测试它,但它应该可以工作。为什么不能注入数据源名称?或者从属性文件中读取它?我只是找不到一种方法来执行它并同时使用@PersistenceContext。我已经尝试过这个方法,它是有效的,但是如果其中一个连接失败,应用程序将无法部署。也许可以克服它。您遇到了什么类型的错误?类似以下内容-->内部异常:java.sql.SQLException:分配连接时出错。原因:连接无法分配:因为连接尝试失败。请考虑用堆栈跟踪询问新问题,以及使用DATABORCE配置对App Server和DB的信息。
@PersistenceContext(unitName = "PU2")
EntityManager em;