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

时间:2022-10-28 06:28:05
  
分布式跨数据库的事务处理要用到 oracle.jdbc.xa.client.OracleXADataSource 类型的数据源。我们要把数据源注册到 jndi 服务上去。注册的 xml 文件名称为 oracle-xa-ds.xml: 文件格式如下 :
分布式跨数据库的事务处理解决方案jta<? xml version="1.0" encoding="UTF-8" ?>
分布式跨数据库的事务处理解决方案jta
< datasources >
分布式跨数据库的事务处理解决方案jta 
< xa-datasource >
分布式跨数据库的事务处理解决方案jta
< jndi-name > myDs </ jndi-name >
分布式跨数据库的事务处理解决方案jta
<! —把数据源注册为全局的,缺省的情况下为true-- >
分布式跨数据库的事务处理解决方案jta       
< use-java-context > false </ use-java-context >
分布式跨数据库的事务处理解决方案jta    
< track-connection-by-tx />
分布式跨数据库的事务处理解决方案jta    
< isSameRM-override-value > false </ isSameRM-override-value >   < xa-datasource-class > oracle.jdbc.xa.client.OracleXADataSource </ xa-datasource-class >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="URL" > jdbc:oracle:thin:@databaseUrl:orcl </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="User" > user </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="Password" > passwrod </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta           
< metadata >
分布式跨数据库的事务处理解决方案jta         
< type-mapping > Oracle9i </ type-mapping >
分布式跨数据库的事务处理解决方案jta    
</ metadata >
分布式跨数据库的事务处理解决方案jta 
</ xa-datasource >
分布式跨数据库的事务处理解决方案jta 
< xa-datasource >
分布式跨数据库的事务处理解决方案jta    
< jndi-name > myDs1 </ jndi-name >
分布式跨数据库的事务处理解决方案jta       
< use-java-context > false </ use-java-context >
分布式跨数据库的事务处理解决方案jta    
< track-connection-by-tx />
分布式跨数据库的事务处理解决方案jta    
< isSameRM-override-value > false </ isSameRM-override-value >     < xa-datasource-class > oracle.jdbc.xa.client.OracleXADataSource </ xa-datasource-class >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="URL" > jdbc:oracle:thin:@databaseUrl:orcl </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="User" > user </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta    
< xa-datasource-property  name ="Password" > password </ xa-datasource-property >
分布式跨数据库的事务处理解决方案jta
< exception-sorter-class-name > org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter </ exception-sorter-class-name >
分布式跨数据库的事务处理解决方案jta       
< no-tx-separate-pools />
分布式跨数据库的事务处理解决方案jta    
< metadata >
分布式跨数据库的事务处理解决方案jta         
< type-mapping > Oracle9i </ type-mapping >
分布式跨数据库的事务处理解决方案jta    
</ metadata >
分布式跨数据库的事务处理解决方案jta 
</ xa-datasource >
分布式跨数据库的事务处理解决方案jta
< mbean  code ="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter"  
分布式跨数据库的事务处理解决方案jta         name
="jboss.jca:service=OracleXAExceptionFormatter" >
分布式跨数据库的事务处理解决方案jta    
< depends  optional-attribute-name ="TransactionManagerService" > jboss:service=TransactionManager </ depends >
分布式跨数据库的事务处理解决方案jta 
</ mbean >
分布式跨数据库的事务处理解决方案jta
</ datasources >
分布式跨数据库的事务处理解决方案jta
   可直接把该文件放置到 deploy 目录下面。 Jboss 中带有示例程序目录位置为 /docs/examples/jca
把上面的 xml 文件部署完毕后还有一个地方需要修改那就是 /server/default/conf 目录下的 jboss-service.xml 配置文件中有:
分布式跨数据库的事务处理解决方案jta<!--  The configurable Xid factory. For use with Oracle, set pad to true  -->
分布式跨数据库的事务处理解决方案jta   
< mbean  code ="org.jboss.tm.XidFactory"
分布式跨数据库的事务处理解决方案jta      name
="jboss:service=XidFactory" >
分布式跨数据库的事务处理解决方案jta      
<!-- attribute name="Pad">true</attribute -->
分布式跨数据库的事务处理解决方案jta   
</ mbean >
分布式跨数据库的事务处理解决方案jta
如果你使用的 jdbc 驱动 version>=10.0 此处可以不修改,如果 jdbc 驱动 version<10.0, 那就要把 pad 属性值设置为 true; 这样你就可以写代码编辑分布式事务处理了。
首先要设置上下文属性值:
分布式跨数据库的事务处理解决方案jtaUserTransaction tx  = null ;
分布式跨数据库的事务处理解决方案jtaProperties props 
=   new  Properties();
分布式跨数据库的事务处理解决方案jtaprops.setProperty(Context.INITIAL_CONTEXT_FACTORY, ”org.jnp.interfaces.NamingContextFactory”);
分布式跨数据库的事务处理解决方案jtaprops.setProperty(Context.PROVIDER_URL, ”jnp:
// localhost:1099”);
分布式跨数据库的事务处理解决方案jta
props.setProperty(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
分布式跨数据库的事务处理解决方案jtaInitialContext ctx 
=   new  InitialContext(props);
分布式跨数据库的事务处理解决方案jtaTx 
= (UserTransaction)ctx.lookup(“UserTransaction”);
分布式跨数据库的事务处理解决方案jta
运行上面这段代码你可能会得到这样的异常:
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 包,否则可能会引起运行不成功!