最近正在研究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的教程不知道可否拿出来共享一下,对此感激不尽~~~
由于网上关于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的教程不知道可否拿出来共享一下,对此感激不尽~~~
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至于多应用之间的事务处理,那就更麻烦了,具体情况具体分析吧。
而 atomikos 则不需要JNDI的支持 所以哥推荐使用 atomikos 它也是开源产品参照我的博文 http://blog.csdn.net/lanseba/archive/2010/08/20/5825960.aspx