1

我对JTA一无所知,要了解整体场景,请点击此链接如何维护三个不同数据库的3个顺序事务的酸属性 ,但是根据帖子的建议,我必须使用分布式事务。我正在使用 apache-tomcat 服务器。

但正如我所说,我对 JTA 一无所知,所以我的问题是,我有超过 15 个数据库连接,并且根据某些条件,它们各自的数据库已连接。所以我不能为每个数据库创建 hibernate.cfg.xml 和会话工厂和实体。

所以我的问题是,我可以将 JTA 与普通 jdbc 一起使用吗?,如果可能的话,然后给我一些链接或例子。

4

1 回答 1

1

是的 。您可以将 JTA 与普通 JDBC 一起使用。一般的想法是,不是使用 JDBC Connection对象来声明事务边界,而是使用 JTA 实现提供的 Transaction Manager 对象来声明事务边界。

例如,在Bitronix Transaction Manager的情况下,声明跨多个数据库连接的事务边界 可以通过以下代码完成:

        PoolingDataSource derbyDataSource1 = new PoolingDataSource();
        derbyDataSource1.setClassName("org.apache.derby.jdbc.EmbeddedXADataSource");
        derbyDataSource1.setUniqueName("derby1");  
        derbyDataSource1.getDriverProperties().setProperty("databaseName", "database1");
        derbyDataSource1.init();

        PoolingDataSource derbyDataSource2= new PoolingDataSource();
        derbyDataSource2.setClassName("org.apache.derby.jdbc.EmbeddedXADataSource");
        derbyDataSource2.setUniqueName("derby2");
        derbyDataSource2.getDriverProperties().setProperty("databaseName", "database2");
        derbyDataSource2.init();

        BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();

        btm.begin();
        try {
            Connection c1= derbyDataSource1.getConnection();
            Connection c2= derbyDataSource2.getConnection();

            /***Use c1 and c2 to execute statements again their corresponding DBs as usual**/


            btm.commit();
        } catch (SQLException ex) {
            ex.printStackTrace();
            btm.rollback();
        }
于 2012-11-08T06:13:18.287 回答