JTA 個人總結Code例子

passport_daizi發表於2012-06-21

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。