arvin_codeHunk
arvin_codeHunk

Reputation: 2390

How to use distributed transactions JTA using plain jdbc

I have no Idea about JTA,to understand the overall scenarios please follow this link How to maintain acid property of 3 sequential transaction of three diffrenet databases ,However based on suggestions from the post,I have to use Distributed transactions. I am using apache-tomcat server.

But As I said i have no idea about JTA, So my problem is that, I have more than 15 database connection, and based on the some condition, their respective database is connected. So I can't create hibernate.cfg.xml and session factories and entities for each databases .

So My question is that, can i use JTA with plain jdbc? ,and if possible then provide me some links or examples.

Upvotes: 2

Views: 1713

Answers (1)

Ken Chan
Ken Chan

Reputation: 90427

Yes . You can use JTA with plain JDBC . The general idea is that instead of using JDBC Connection object to declare the transaction boundary , you use the Transaction Manager object which is provided by the JTA implementation to declare the transaction boundary .

For example , in the case of Bitronix Transaction Manager , declaring a transaction boundary across many database Connection can be done by the following codes:

        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();
        }

Upvotes: 2

Related Questions