JTA 个人总结Code例子

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。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中留言,我会及时回复的。 <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/> <!-- JTA事务管理器 --> <bean id="myJtaManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="jotm"/> </property> </bean> <!-- 数据源A --> <bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> </bean> </property> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 数据源B --> <bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource"> <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="${jdbc2.driver}"/> <property name="url" value="${jdbc2.url}"/> </bean> </property> <property name="user" value="${jdbc2.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 事务切面配置 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..servi1ce*..*(..))"/> <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <!-- 通知配置 --> <tx:advice id="txAdvice" transaction-manager="myJtaManager"> <tx:attributes> <tx:method name="delete*" rollback-for="Exception"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="*" read-only="true" rollback-for="Exception"/> </tx:attributes> </tx:advice ...... ...... ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值