分布式跨数据库的事务处理解决方案jta

本文介绍了如何利用JTA(Java Transaction API)处理分布式跨数据库事务,特别是通过OracleXADataSource配置数据源并注册到JNDI。讨论了在JBoss中部署配置文件,如oracle-xa-ds.xml,以及在不同JDBC驱动版本下对jboss-service.xml的调整。还提到了在代码中设置UserTransaction和处理可能的异常,强调了环境配置的重要性,包括避免无用jar包的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  
分布式跨数据库的事务处理要用到oracle.jdbc.xa.client.OracleXADataSource类型的数据源。我们要把数据源注册到jndi服务上去。注册的xml文件名称为oracle-xa-ds.xml:文件格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
 
<xa-datasource>
<jndi-name>myDs</jndi-name>
<!—把数据源注册为全局的,缺省的情况下为true-->
       
<use-java-context>false</use-java-context>
    
<track-connection-by-tx/>
    
<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:@databaseUrl:orcl</xa-datasource-property>
    
<xa-datasource-property name="User">user</xa-datasource-property>
    
<xa-datasource-property name="Password">passwrod</xa-datasource-property>
           
<metadata>
         
<type-mapping>Oracle9i</type-mapping>
    
</metadata>
 
</xa-datasource>
 
<xa-datasource>
    
<jndi-name>myDs1</jndi-name>
       
<use-java-context>false</use-java-context>
    
<track-connection-by-tx/>
    
<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:@databaseUrl:orcl</xa-datasource-property>
    
<xa-datasource-property name="User">user</xa-datasource-property>
    
<xa-datasource-property name="Password">password</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>Oracle9i</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>
   可直接把该文件放置到deploy目录下面。Jboss中带有示例程序目录位置为/docs/examples/jca
把上面的xml文件部署完毕后还有一个地方需要修改那就是/server/default/conf目录下的jboss-service.xml配置文件中有:
<!-- The configurable Xid factory. For use with Oracle, set pad to true -->
   
<mbean code="org.jboss.tm.XidFactory"
      name
="jboss:service=XidFactory">
      
<!--attribute name="Pad">true</attribute-->
   
</mbean>
如果你使用的jdbc驱动version>=10.0此处可以不修改,如果jdbc驱动 version<10.0,那就要把pad属性值设置为true;这样你就可以写代码编辑分布式事务处理了。
首先要设置上下文属性值:
UserTransaction tx =null;
Properties props 
= new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, ”org.jnp.interfaces.NamingContextFactory”);
props.setProperty(Context.PROVIDER_URL, ”jnp:
//localhost:1099”);
props.setProperty(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
InitialContext ctx 
= new InitialContext(props);
Tx 
=(UserTransaction)ctx.lookup(“UserTransaction”);
运行上面这段代码你可能会得到这样的异常:
Java.lang.RuntimeException: UT factory lookup failed 
这也涉及到你所使用的jboss版本的问题:
Version>=4.0.2:就使用org.jboss.naming.NamingContextFactory 来代替org.jnp.interfaces.NamingContextFactory.
Version<4.0.2:就使用jboss自带的jndi.properties文件进行配置。这样就可以进行分布式的事务处理了。
注意:UserTransaction中不能再嵌套其他的任何事务,否则会抛出异常。Jta.jar包要特别留意,如果按照以上配置仍不能运行,那就把环境中存在的jta.jar包删除。该事务管理的实现对上下文环境要求较高,环境中不要引入没有用处的jar包,否则可能会引起运行不成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值