最近正在研究jta,感觉从J2EE上去控制事务要比单纯的通过写jdbc代码去控制事务要好,但是学习过程中遇到几个问题,还请高手们给解答一下:
由于网上关于jta的教程或者资料不多,零零散散的找了一些,自己做了个小例子:public void doService(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{

UserTransaction ut = null;
Connection eomsXACon = null;
Statement stmt1 = null;
Connection bpedbXACon = null;
Statement stmt2 = null;

try{
Context ctx =new InitialContext();
                                    //从WebSphere中获取一个UserTransaction
ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); 

ut.begin();

eomsXACon = Helper.getXAEomsCon();
eomsXACon.setAutoCommit(true);
stmt1 = eomsXACon.createStatement();

bpedbXACon = Helper.getXABpedbCon();
bpedbXACon.setAutoCommit(true);
stmt2 = bpedbXACon.createStatement();

StringBuffer sql2 = new StringBuffer();
sql2.append("insert into z_jta_test_bpcdb (ID,name,re) values(z_jta_test_emos3_seq.nextval,'name','rekarm')");
System.out.println("sql2==" + sql2.toString());
System.out.println("stmt2==" + stmt2);
stmt2.execute(sql2.toString());

StringBuffer sql1 = new StringBuffer();
sql1.append("insert into z_jta_test_eoms3 (ID,name,re) values(5,'name','rekarm')");
System.out.println("sql1==" + sql1.toString());
System.out.println("stmt1==" + stmt1);
stmt1.execute(sql1.toString());

ut.commit();

}catch(Exception e){
try{
ut.rollback();
}catch(Exception se){
se.printStackTrace();
}
e.printStackTrace();

}finally{
try{
if(null != stmt1) stmt1.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(null != eomsXACon) eomsXACon.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(null != stmt2) stmt2.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(null != bpedbXACon) bpedbXACon.close();
}catch(Exception e){
e.printStackTrace();
}
}
 }以上代码有几个问题想问一下,当时写这段例子的时候问过一个曾经用过jta的同事,说,在用jta提交以后,数据库连接还需要手工进行关闭,Statement ResultSet等也需要关闭,请问是这样的吗,我感觉如果jta不能对这些进行管理的话,那他和普通的jdbc又有什么区别呢,或者是说jta对此有自己的管理我没找到而已?另外,如果是这种情况:一个是dao类,一个是EJB的调用,这样怎么用jta去控制事务?
还有,多应用之间的事务如何通过jta进行管理?比如说调用其他系统的webservice的时候最后,如果哪位大仙有比较系统的jta的教程不知道可否拿出来共享一下,对此感激不尽~~~

解决方案 »

  1.   

    连接对象肯定是要关闭的。数据库连接对象,也得通过 JNDI 从 WebSphere 中获得 DataSource,再从 DataSource 中获得连接。JTA 属于容器管理的事务,不能在 J2SE 的环境中运行,也就是说不能在 Tomcat 等非 J2EE 容器中配置 JTA 事务。JTA 是 OMG 的对象事务服务的 Java 实现,JTA 一般由应用服务器管理,可以跨数据库、跨资源进行事务管理,当然了也能管理一个数据库的事务。应用服务器要支持分布式事务,需要使用两阶段提交协议(two phase commit, 2-PC),关于这个可以到网上搜些资料。普通的 JDBC 是不支持分布式事务处理的,也就是说无法将两个 Connection 纳入到一个事务中去。你最后说到 WebServices。关于 WebServices 在 W3C 中有定义事务标准的,参考:
    http://www.ibm.com/developerworks/cn/webservices/specification/ws-tx/Java 中,在 java.net 上有个 WSIT 可以支持很多 WS-* 规范,其中就有涉及 WebService 事务操作的 WS-AtomicTransaction 和 WS-Coordination。关于 WS-TX 在那上面还有个例子,服务端是使用 JMS 和 JDBC 作为 XA 的原子事务,客户端那个例子实现了两个,Servlet 的和 C# 的。https://wsit-docs.dev.java.net/releases/1.1/ahiip.html那个例子是部署在 Glassfish 应用服务器上的,构建和部署脚本在那里都有。至于其他 Java WebService 的框架,比如 CXF 目前还不支持 WS-AtomicTransaction 和 WS-Coordination,而 AXIS 2 需要 AXIS 的子项目 Kandula 才能支持。http://www.oschina.net/p/apache+kandula至于多应用之间的事务处理,那就更麻烦了,具体情况具体分析吧。
      

  2.   

    6楼的仁兄  jta的确可以脱离web环境来部署可以使用 JOTM 或者是 ATOMIKOS 等 但是 貌似JOTM需要 JNDI 的支持 脱离不了Web服务器,
    而 atomikos 则不需要JNDI的支持 所以哥推荐使用 atomikos 它也是开源产品参照我的博文 http://blog.csdn.net/lanseba/archive/2010/08/20/5825960.aspx