使用spring+atomikos+ibatis實現(xiàn)聲明式DB2多數(shù)據(jù)庫全局分布式事務,關(guān)鍵是DB2數(shù)據(jù)庫驅(qū)動程序和數(shù)據(jù)庫訪問參數(shù)
的配置。db2的jdbc driver有好幾種,不同的driver,參數(shù)的寫法也不同,甚至端口也不一樣,而且本人使用的DB2 V8.2驅(qū)動程序db2jcc.jar有bug,必須使用fp12版本的db2jcc.jar代替,才能實現(xiàn)全局分布式事務
atomikos官網(wǎng)上沒有提供DB2的配置示例,試了多次,以下配置終于搞定了全局分布式事務,見其中的注釋
<tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="get*" read-only="true" /><tx:method name="*" rollback-for="Throwable"/></tx:attributes></tx:advice><!-- 在類foo.bar.MyClass的myMethod()方法里實現(xiàn)全局分布式事務,該方法對兩個數(shù)據(jù)源進行操作 --><aop:config><aop:pointcut id="myOperation"expression="execution(*foo.bar.MyClass.myMethod(..))" /><aop:advisor advice-ref="txAdvice"pointcut-ref="myOperation" /></aop:config><!-- 數(shù)據(jù)源1 --><bean id="dataSource"class="com.atomikos.jdbc.AtomikosDataSourceBean"><property name="uniqueResourceName"><value>app/main</value></property><property name="xaDataSourceClassName"><value>[b]com.ibm.db2.jcc.DB2XADataSource[/b]</value></property><property name="xaProperties"><props>[b]<prop key="serverName">172.160.1.138</prop><prop key="portNumber">50000</prop><prop key="databaseName">MYDB</prop><prop key="user">db2admin</prop><prop key="password">pass</prop><prop key="driverType">4</prop>[/b]</props></property><property name="poolSize"><value>5</value></property></bean><!-- 數(shù)據(jù)源2 --><bean id="dataSourceHis"class="com.atomikos.jdbc.AtomikosDataSourceBean"><property name="uniqueResourceName"><value>app/history</value></property><property name="xaDataSourceClassName"><value>com.ibm.db2.jcc.DB2XADataSource</value></property><property name="xaProperties"><props><prop key="serverName">172.160.1.139</prop><prop key="portNumber">50000</prop><prop key="databaseName">NDB</prop><prop key="user">db2admin</prop><prop key="password">pass</prop><prop key="driverType">4</prop></props></property><property name="poolSize"><value>5</value></property></bean><!-- 數(shù)據(jù)源1的iBatis sqlMapClient --><bean id="sqlMapClient1"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation"><value>SqlMapConfig.xml</value></property><property name="dataSource"><ref bean="dataSource" /></property></bean><!-- 數(shù)據(jù)源2的iBatis sqlMapClient --><bean id="sqlMapClient2"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation"><value>SqlMapConfig.xml</value></property><property name="dataSource"><ref bean="dataSourceHis" /></property></bean><bean id="atomikosTransactionManager"class="com.atomikos.icatch.jta.UserTransactionManager"init-method="init" destroy-method="close"><property name="forceShutdown"><value>true</value></property></bean><bean id="atomikosUserTransaction"class="com.atomikos.icatch.jta.UserTransactionImp"><property name="transactionTimeout" value="240" /></bean><bean id="txManager"class="org.springframework.transaction.jta.JtaTransactionManager"><property name="transactionManager"><ref bean="atomikosTransactionManager" /></property><property name="userTransaction"><ref bean="atomikosUserTransaction" /></property></bean><-- 訪問數(shù)據(jù)源1的dao --><bean id="dao1" class="foo.bar.dao.My1DAOImpl"><property name="sqlMapClient"><ref bean="sqlMapClient" /></property></bean><-- 訪問數(shù)據(jù)源2的dao --><bean id="dao2" class="foo.bar.dao.My2DAOImpl"><property name="sqlMapClient"><ref bean="sqlMapClientHis" /></property></bean></beans>
iBatis的配置沒有特殊的地方,使用abator for iBatis自動生成,abatorConfig.xml里daoGenerator的type屬性設置為'SPRING'