JTA,即Java Transaction API,译为Java事务API。
JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
类:test.java
import java.sql.Connection; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import javax.transaction.UserTransaction; /** * @author zcshun * @see 提供了一个获得全局事务UserTransaction对象的方法。 * 提供了两个获得分布式数据库服务器datasource对象。(通过在resin中间件中配置JNDI) * 提供了两个获得分布式数据库服务器的connection对象。 * @date 2012-6-21 上午10:49:56 */ public class text { /** * 获取全局式事务接口 */ public static UserTransaction getUserTransaction(){ UserTransaction userTransaction = null; try { Context initContext = new InitialContext(); userTransaction = (UserTransaction) initContext.lookup("java:comp/UserTransaction"); } catch (Exception e) { e.printStackTrace(); } return userTransaction; } /** * 功能:获取db2数据库的数据源 */ static private DataSource getDataSouceFromDB2() { DataSource _source = null; if (_source == null){ try { Context context = new javax.naming.InitialContext(); //从JNDI取出java环境上下文对象 _source = (DataSource) context.lookup("java:comp/env/jdbc/db2Demo");//取出数据源 } catch (NamingException e) { System.out.println("NamingException->"+e.toString()); } } if(_source == null){ System.out.println("_source为null"); } return _source; } /** * 功能:获取db2数据库的连接对象 */ public static Connection getConnectionFromDB2(){ try{ Connection c = getDataSouceFromDB2().getConnection(); //从连接池获取连接对象 //c.setReadOnly(false); if(c!=null) System.out.println("已经获得DB2数据库连接对象conn。"); return c; } catch (Exception e) { System.err.println("JndiRes.getConnection() error."); e.printStackTrace(); return null; } } /** * 功能:获取oracle数据库数据源: */ static private DataSource getDataSouceFromOracleDB() { DataSource _source = null; if (_source == null){ try { Context env = new javax.naming.InitialContext(); _source = (DataSource) env.lookup("java:comp/env/jdbc/oracleDemo"); } catch (NamingException e) { System.out.println("NamingException->"+e.toString()); } } return _source; } /** * 功能:获得Oracle数据库连接对象。 */ public static Connection getConnectionFromOracleDB(){ try{ Connection c = getDataSouceFromOracleDB().getConnection(); if(c!=null) System.out.println("已经获得oracle数据库连接对象conn。"); return c; } catch (Exception e) { System.err.println("JndiRes.getConnection() error."); e.printStackTrace(); return null; } } }
类Demo.java
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.transaction.NotSupportedException; import javax.transaction.SystemException; import javax.transaction.UserTransaction; /** * @author zcshun * @see 使用JTA控制全局事务的Demo类 * @date 2012-6-21 上午11:05:55 */ public class Demo { public void Search(){ UserTransaction userTransaction = null; Connection conn1 = null; Connection conn2 = null; text t = new text(); userTransaction = t.getUserTransaction(); conn1 = t.getConnectionFromDB2(); conn2 = t.getConnectionFromOracleDB(); if(conn1 != null && conn2 != null && userTransaction != null){ System.out.println("----------个对象成功就位!"); } try { userTransaction.begin(); } catch (NotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SystemException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Statement sta1 = conn1.createStatement(); Statement sta2 = conn2.createStatement(); String sql1 = "INSERT INTO user(ID,NAME,AGE,SEX,ADDRESS)VALUES(1,'XIAOQIANG','15','1','湖北武汉')"; String sql2 = "INSERT INTO usertext(ID,NAME,AGE,SEX,ADDRESS)VALUES(1,'XIAOQIANG','15','1','湖北武汉')"; sta1.executeQuery(sql1); sta2.executeQuery(sql2); userTransaction.commit(); sta1.close(); sta2.close(); conn1.close(); conn2.close(); } catch(Exception e){ e.printStackTrace(); try { userTransaction.rollback(); } catch (IllegalStateException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SecurityException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SystemException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("调用异常!"); } } }
在调用的时候可以创建Demo的对象,然后调用其实例的Search()方法即可。
Demo d = new Demo();
d.Search();
至于如何在resin中间件中配置JNDI,可参照 http://blog.csdn.net/kalision/article/details/7652375。
如有问题:请加技术qq群讨论143461002。