`

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文件是一个配置数据库信息模板如:
<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)编写测试类:
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();
		}
	}
}

  这样在JBoss中配置Oracle数据库的JTA就完成了。希望能给广大java学习者提供一些帮助。
2
0
分享到:
评论

相关推荐

    java 面试题 总结

    Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接...

    超级有影响力霸气的Java面试题大全文档

    31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建...

    java开源包1

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包11

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包2

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包3

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包6

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包5

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包10

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包4

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包8

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包7

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    java开源包9

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    JAVA上百实例源码以及开源项目

    百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 ...

    java开源包101

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

    Java资源包01

    JFile 是 JActor 的文件持久化组件,以及一个高吞吐量的可靠事务日志组件。 Google地图JSP标签库 利用Google:maps JSP标签库就能够在你的Web站点上实现GoogleMaps的所有功能而且不需要javascript或AJAX编程。它还...

Global site tag (gtag.js) - Google Analytics