JOTM 分布式事务初探(JNDI,Tomcat 7 JDBC Pool连接池)

JOTM 分布式事务初探(JNDI,Tomcat 7 JDBC Pool连接池)

Tomcat 7 带了一个新的连接池 tomcat(The Tomcat JDBC Connection Pool)

网上有人测试,据说性能超过常用连接池(c3p0等).

链接:http://www.open-open.com/lib/view/open1329182303124.html

并且这个连接池提供的连接不是普通的Connection,而是pooledConnection,

而且支持提供XADataSource(org.apache.tomcat.jdbc.pool.XADataSource).

The Tomcat JDBC Connection Pool可独立使用,

需要Tomat7版本下lib包中的tomcat-jdbc.jar和bin中的tomcat-juli.jar

可以用来做JOTM的分布式事务的数据源.

实际使用tomcat版本 是5.5.25

JOTM版本 2.1.9 http://jotm.ow2.org/xwiki/bin/view/Main/Download_Releases

1. 新建一个Java web工程

   将JOTM的lib包下的所有jar包(包括一个空的ext文件夹)拷贝到web-inf的lib下

   

   将Tomcat版本中的tomcat-jdbc.jar和tomcat-juli.jar拷贝到

   tomcat5.5.25的common\lib下,并引入到工程中来.

   

   将 mysql和oracle的jdbc驱动拷贝到web-inf的lib下

   (classes12.jar--oracle驱动,mysql-connector-java-5.1.24-bin.jar--mysql驱动)

   

   需要将web-inf的lib下所有jar包拷贝到tomcat5.5.25的common\lib下,部署的时候,注意将

   webapps\工程\web-inf的lib下的jar全部删除,使用tomcat5.5.25的common\lib下的jar包

2. 分别在mysql和oracle中创建测试数据库和测试用户

   2.1 mysql数据库(mysql 版本mysql  Ver 14.14 Distrib 5.5.11, for Win32 (x86))

   下面的语句执行前,可能需要使用root用户登陆

   

Context ctx = new InitialContext();  
  
   // JDBC stuff  
   DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysqlDB"); //mysql数据源  
        
   DataSource dsOra = (DataSource) ctx.lookup("java:comp/env/jdbc/oracleDB");//oarcle数据源  
        
   UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction"); //用户事务(分布式)  

   

6. 测试分布式事务.

   上面在mysql和oracle中分别创建了一个表,并且表里面数据不能重复.

   

   初始化时在mysql中插入一条语句:

   insert into testdata(id,foo) values(1,1);

   

   然后在程序中处理:

   (1) 启动用户事务

   (2) 在oracle中插入语句insert into testdata(id,foo) values(1,1); --oracle是首次插入这个语句

   (3) 在mysql中重复插入数据

   (4) 如果一切正常提交事务,否则回滚事务

   

   分析: 假如不使用分布式事务,则oracle插入数据成功,mysql插入数据失败(重复插入).

   但是现在使用分布式事务,回滚时,导致oracle中的数据也回滚.

   所以上面4个步骤执行完毕后,oracle中仍然没有数据.

   

   测试代码:

   

package foo;  
  
import java.sql.Statement;  
  
import javax.naming.Context;  
import javax.naming.InitialContext;  
import javax.sql.DataSource;  
import javax.transaction.UserTransaction;  
  
public class DBTest  
{  
  
  int foo = -1;  
  
  // value stored in DB  
  
  public void init(String completion)  
  {  
    UserTransaction ut = null;  
    try  
    {  
      Context ctx = new InitialContext();  
  
      // mysql数据源  
      DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysqlDB");  
      //oracle数据源  
      DataSource dsOra = (DataSource) ctx.lookup("java:comp/env/jdbc/oracleDB");  
      //用户事务(分布式)  
      ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");  
        
        
      java.sql.Connection conn = ds.getConnection();  
      java.sql.Connection connOra = dsOra.getConnection();  
        
      System.out.println("<<< beginning the transaction >>>");  
      ut.begin();  
        
      //oracle中插入数据  
      Statement stmtOra =connOra.createStatement();  
      stmtOra.execute("insert into testdata(id,foo) values(1,1)");  
  
      // mysql中插入数据(之前表里面已经有一样的数据,导致下面的插入数据失败)  
      Statement stmt = conn.createStatement();  
      stmt.execute("insert into testdata(id,foo) values(1,1)");  
      //mysql 中插入失败导致整个事务回滚,oracle也回滚了,导致oracle中仍然没有数据.  
        
  
      System.out.println("<<< committing the transaction >>>");  
      ut.commit();  
  
      stmt.close();  
      stmtOra.close();  
  
      conn.close();  
      connOra.close();  
        
      System.out.println("<<< done >>>");  
    }  
    catch (Exception e)  
    {  
      try  
      {  
        System.out.println("<<< rollbacking the transaction >>>");  
        ut.rollback();  
      }  
      catch (Exception es)  
      {  
        System.out.println("rollbacking error >> ");  
        es.printStackTrace();  
      }  
        
      System.out.println("DBTest >> ");  
      e.printStackTrace();  
    }  
  }  
  
  public String getFoo()  
  {  
    return "" + foo;  
  }  
}  

   

参考 :http://static.raibledesigns.com/downloads/howto-tomcat-jotm.html

http://static.raibledesigns.com/downloads/howto-tomcat-jotm.html

http://www.blogjava.net/nokiaguy/archive/2008/05/08/199150.html

相关推荐