JTA 二(Jotm 与StandardXADataSource )

Jotm是一个open source的JTA实现(可以google或者百度其下载连接),下面就用例子来说明其应用,并且在代码中说明一些问题.(后面我都将主要的code写出来,方法名,或者类名之类的,我都省略)


前面提到JTA可以处理的,是符合XA接口的资源,而我们通常的资源不是XA接口的,那么我们可以做的是:

1) 将非XA的资源通过某种方式转为XAResource(这种方式我并不推荐,因为其实质还是非XA的Resource,其并不能从jta中获益),

2) 利用实现方提供的XA实现,常见的商用数据库或者一些open source的database,jms等都有提供xa的实现


jotm提供了一种将非xa的jdbc转为xadatasource的接口,代码如下:


        StandardXADataSource xaDataSource=new StandardXADataSource();            
        xaDataSource.setUser("sa");
        xaDataSource.setPassword("");
        xaDataSource.setDriverName("org.h2.Driver");
        xaDataSource.setUrl("jdbc:h2:~/test");
        XAConnection xaConnection=xaDataSource.getXAConnection();

        XAResource xaResource=xaConnection.getXAResource();

        java.sql.Connection conn=xaConnection.getConnection();

        Statement sta=conn.createStatement();
       sta.executeUpdate("insert into Test(id,name)values(5,'xiaoming')");



之后呢,我们就可以对conn进行数据库的操作了,在上面的代码中,我们只是将一个非XA的数据库连接,封装为了一个XA的Resource以方便后面进行与JTA相关的操作。

怎么样操作呢?我们需要一个JTA的TransactionManager,这个对象是用来对XAResource事务管理的,jotm作为一个JTA的实现,可以在脱离javaee的容器的环境中,来使用JTA。

下面是如何获得TransactionManager(很简单):

Jotm jotm=new Jotm(true,false);//除了将jotm的所依赖包放入classpath之外,记得一定将jotm的一个属性文件 carol.properties也要复制到src下
 TransactionManager transactionManager=jotm.getTransactionManager();

这样子我们就有了进行事务管理的两个重要资源TransactionManager,XAResource


完全的代码如下


public static void main(String[]args)throws Exception{


try{

        StandardXADataSource xaDataSource=new StandardXADataSource();            
        xaDataSource.setUser("sa");
        xaDataSource.setPassword("");
        xaDataSource.setDriverName("org.h2.Driver");
        xaDataSource.setUrl("jdbc:h2:~/test");
        XAConnection xaConnection=xaDataSource.getXAConnection();

        XAResource xaResource=xaConnection.getXAResource();


       Jotm jotm=new Jotm(true,false);
       TransactionManager transactionManager=jotm.getTransactionManager();

        transactionManager.begin();//事务开始
       Transaction transaction=transactionManager.getTransaction();/整个事务的过程,也是一个对象Transaction

        transaction.enlistResource(xaResource);


        java.sql.Connection conn=xaConnection.getConnection();

        Statement sta=conn.createStatement();
       sta.executeUpdate("insert into Test(id,name)values(5,'xiaoming')");

       try{

             transaction.commit();//事务提交

       }catch(Exception e){

             transaction.rollback;//事务提交

      }       
      jotm.stop();//停止jotm

}finally{

     System.exit(0);//退出

}


以上就是整个例子了,网上jotm+spring的例子有很多,可以参考.

说明的是,对于JTA的事务管理,有点类似与jdbc中将Connection AutoCommit设置为false,也就是说,如果不进行最后的commit,那么对于数据所做的更改,是不会反应到数据库的。


转载于:https://my.oschina.net/u/186769/blog/659510

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值