[项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性。此处使用atomikos来实现:最后附源码:1:
前言
想看实际产生的SQL,在一个数据源的情况下,最简单的方式是使用Log4jdbc。
但在spring-data-jpa通过Atomikos实现JTA事务中,我们通过Atomikos实现了分布式事务,配置的是支持XA的DataSource,Log4jdbc这种在Driver上做文章的方法肯定不行。
这里使用jdbcdslog的衍生项目jdbcdslog-exp来实现这个目标。jdbcdslog-exp比jdbcdslog更进了一步,输出的SQL,可以直接拷贝到PL/SQL等工具下执行。
依赖
jdbcdslog的依赖如下
com.googlecode.usc
jdbcdslog
1.0.6.2
配置方式
properties配置信息
这里以Oracle为例,properties内容如下,当然dataSource配置信息等需要两份
dev.jdbc.dataSource=org.jdbcdslog.ConnectionPoolXADataSourceProxy
dev.jdbc.url=jdbc:oracle:thin:@192.168.3.129:1521:gtf?targetDS=oracle.jdbc.xa.client.OracleXADataSource
dev.jdbc.username=adp_dev
dev.jdbc.password=adp_dev
其中url相当于url + targetDS ,targetDS的值为普通方式下的dataSource。
配置文件
destroy-method="close">
${dev.jdbc.url}
${dev.jdbc.username}
${dev.jdbc.password}
问题
实际运行时会发生错误,原因是由于AtomikosDataSourceBean中doInit方法中在该方法的最后才调用的PropertyUtils.setProperties(xaDataSource, xaProperties );这段代码,导致上面调用setLogWriter的时候缺少参数。
[ 网上有很多的atomikos的分布式事务管理的配置,但是大多数都是同一类型的数据库,并没有跨数据库类型的配置。使用的数据库是Oracle和mysql。 配置文件代码如下:
解决方法
1.提供一个无视set/get方法的反射工具;
2.AtomikosDataSourceBean中用到的参数AtomikosXAConnectionFactory 没有访问修饰符,无法访问的问题;
3.重新实现一个AtomikosDataSourceBean类,并重写doIn