您的位置:首页 > 数据库 > Oracle

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

2011-03-24 09:48 197 查看
首先讲一下我的配置: 
   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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息