JBoss+Oracle+JTA配置分布式事务

首先讲一下我的配置: 
   JBoss是JBoss-4.2.2.GA 
   Oracle是Oracle10g 
(1)(假如我的JBoss装在D盘)把JBoss路径中(D:/jboss-4.2.2.GA/docs/examples/jca)oracle-xa-ds.xml文件复制一份放到JBoss路径D:/jboss-4.2.2.GA/server/default/deploy下面,然后打开可以看到这个XML文件是一个配置数据库信息模板如:

Xml代码 
<datasources> <xa-datasource> <jndi-name>XAOracleDS</jndi-name> <isSameRM-override-value>false</isSameRM-override-value> <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> <xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:hong</xa-datasource-property> <xa-datasource-property name="User">hong</xa-datasource-property> <xa-datasource-property name="Password">hong</xa-datasource-property> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> <no-tx-separate-pools/> <metadata> <type-mapping>Oracle10g</type-mapping> </metadata> </xa-datasource> <mbean code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter" name="jboss.jca:service=OracleXAExceptionFormatter"> <depends optional-attribute-name="TransactionManagerService">jboss:service=TransactionManager</depends> </mbean> </datasources>  


其中需要修改的是<xa-datasource-class>节点如果是Oracl数据库一般都是(oracle.jdbc.xa.client.OracleXADataSource)如果是其他数据库就需要修改成相应的数据库驱动类。 
还要修改<xa-datasource-property name="URL">jdbc:oracle:thin:@IP地址:Oracle的端口号:SID 
修改<xa-datasource-property name="User">节点为自己的数据库用户名。 
修改<xa-datasource-property name="Password">节点为自己数据库的密码。 
修改<type-mapping>节点为相应的数据库产品如:9i,10g,11g. 
(2)编写测试类: 

Java代码 
package myjta.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import javax.transaction.UserTransaction; import myjta.util.MyException; public class DataBase { //事务管理对象 private UserTransaction ut = null; //数据库连接对象 private Connection conn = null; //(Context)上下文对象 private Context context = null; //本身的对象 private static DataBase dataBase = null; //操作数据库对象 private PreparedStatement pstmt = null; //数据集对象 public ResultSet res = null; private DataBase(){ try { context = new InitialContext(); } catch (NamingException e) { e.printStackTrace(); } } /** * 返回自己本身的对象。 * @return 返回DataBase对象 */ public static DataBase getDataBase(){ if(dataBase==null){ dataBase = new DataBase(); } return dataBase; } /** * 创建事务管理对象UserTransaction * @return 返回事务管理对象UserTransaction */ public UserTransaction getUserTransaction(){ try{ //java:comp/UserTransaction是固定写法。 ut = (UserTransaction)context.lookup("java:comp/UserTransaction"); System.out.println("ut = "+ut); }catch(Exception ex){ ex.printStackTrace(); System.out.println("创建UserTransaction"+ex.getMessage()); } return ut; } /** * 创建数据库连接 */ public void getConn(){ try{ //其中java:/是前缀XAoracleDs是上面配置的oracle-ax-ds.xml中<jndi-name>节点的名称。 DataSource ds = (DataSource)context.lookup("java:/XAOracleDS"); conn = ds.getConnection(); }catch(Exception ex){ ex.printStackTrace(); System.out.println("创建数据库连接失败~!"+ex.getMessage()); } } /** * 对数据进行增删改操作的方法 * @param sql 要执行的SQL语句 * @param arrgs 需要想SQL语句中绑定的数据 * @return 返回受影响行数 */ public int excuteUpdate(String sql,String[] arrgs){ this.getConn(); int result = 0; try { pstmt = conn.prepareStatement(sql); if(arrgs!=null && arrgs.length>0){ for(int i=0;i<arrgs.length;i++){ pstmt.setString(i+1, arrgs[i]); } } result = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); throw new MyException("增加删除修改数据错误!"+e.getMessage(),e); }finally{ this.closePstmt(); this.closeConn(); } return result; } /** * 查询数据库数据的方法 * @param sql 要执行查询的SQL语句 * @param arrgs 要该SQL语句绑定的数据 * @return 返回结果集ResultSet */ public ResultSet excuteQuery(String sql,String[] arrgs){ try { pstmt = conn.prepareStatement(sql); if(arrgs!=null && arrgs.length>0){ for(int i=0;i<arrgs.length;i++){ pstmt.setString(i+1, arrgs[i]); } } res = pstmt.executeQuery(); } catch (SQLException e) { e.printStackTrace(); throw new MyException("查询数据错误"+e.getMessage(),e); } return res; } /** * 关闭数据库连接 */ public void closeConn(){ try{ if(conn!=null){ conn.close(); conn = null; } }catch(Exception ex){ ex.printStackTrace(); } } /** * 关闭PreparedStatement对象 */ public void closePstmt(){ try { if(pstmt!=null){ pstmt.close(); pstmt=null; } } catch (SQLException e) { e.printStackTrace(); } } /** * 关闭ResultSet对象 */ public void closeRes(){ try { if(res!=null){ res.close(); res=null; } } catch (SQLException e) { e.printStackTrace(); } } }  

 

 

原文地址:http://zyw090111.javaeye.com/blog/582296

你可能感兴趣的:(oracle,数据库,jboss,null,database,import)