Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 管理多个数据库连接_Java_Database_Ejb_Eclipselink_Entitymanager - Fatal编程技术网

Java 管理多个数据库连接

Java 管理多个数据库连接,java,database,ejb,eclipselink,entitymanager,Java,Database,Ejb,Eclipselink,Entitymanager,我已经为这个问题挣扎了好几天 以下是场景: 我有几个数据库,每个客户都有一个数据库,所有数据库都具有相同的功能 结构(相同的表和列),因此我的应用程序需要在运行时决定需要连接哪个表和列。我正在使用JPA2、EclipseLink和EJB3 我的第一次尝试是使用所有逻辑实现一个定制EntityManager,以便在正确的数据库上执行操作,然后我将该EntityManager配置为一个无状态EBJ,以便可以将其注入@EBJ注释(如此链接所述:)。我不能让它工作,因为它在尝试注入EntityManag

我已经为这个问题挣扎了好几天

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

我的第一次尝试是使用所有逻辑实现一个定制EntityManager,以便在正确的数据库上执行操作,然后我将该EntityManager配置为一个无状态EBJ,以便可以将其注入@EBJ注释(如此链接所述:)。我不能让它工作,因为它在尝试注入EntityManager时抛出了一个异常

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

代码如下:

@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;