分布式跨数据库的事务处理解决方案jta
2007-07-17 15:14
3555 查看
分布式跨数据库的事务处理要用到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>
4000
<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包,否则可能会引起运行不成功!
相关文章推荐
- 也谈 .NET2.0 事务处理 TransactionScope 的使用:[在访问相同数据库时避免讨厌的分布式事务]
- 分布式事务处理解决方案
- 微服务架构的分布式事务解决方案(Dubbo分布式事务处理)
- oracle分布式处理时报“ORA-02041: 客户数据库未开始一个事务处理”解决办法 - z
- 分布式系统中数据库的事务如何处理?
- JTA分布式事务处理
- CodeIgniter框架数据库事务处理的设计缺陷和解决方案
- ORA-02046: 分布式事务处理已经开始解决方案
- 分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?
- 跨数据库分布式事务的处理
- ORA-01591: 锁被未决分布式事务处理解决方案
- 分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?
- ORA-02046: 分布式事务处理已经开始解决方案
- c#使用Transactions类完成多个数据库的事务操作(分布式事务处理)
- CodeIgniter框架数据库事务处理的设计缺陷和解决方案
- 数据库 分布式系统的事务处理
- 【转】错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有--解决方案
- C# 操作数据库分布式事务处理
- 【JTA】JTA允许应用程序执行分布式事务处理
- opensession()和getCurrentSession()方法的区别(JTA(java Transaction Api,分布式事务)事务和Connection事务:数据库自带的事务处理方式)