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。