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,那么对于数据所做的更改,是不会反应到数据库的。