1

JTAについてはわかりません。全体的なシナリオを理解するには、このリンクをたどってください。3つのdiffrenetデータベースの3つのシーケンシャルトランザクションの酸特性を維持する方法ですが 、投稿からの提案に基づいて、分散トランザクションを使用する必要があります。私はapache-tomcatサーバーを使用しています。

しかし、私が言ったように、私はJTAについて知らないので、私の問題は、15を超えるデータベース接続があり、ある条件に基づいて、それぞれのデータベースが接続されていることです。そのため、データベースごとにhibernate.cfg.xmlとセッションファクトリおよびエンティティを作成できません。

だから私の質問は、プレーンjdbcでJTAを使用できますか?、可能であれば、いくつかのリンクまたは例を提供してください。

4

1 に答える 1

1

はい 。プレーンJDBCでJTAを使用できます。一般的な考え方は、JDBC接続オブジェクトを使用してトランザクション境界を宣言する代わりに、JTA実装によって提供されるトランザクションマネージャーオブジェクトを使用してトランザクション境界を宣言することです。

たとえば、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 に答える