[英]How to enlist spring JDBC transaction within a XA-transaction?
使用spring的[3.1] SimpleJdbcCall調用Oracle數據庫中的存儲過程。 同樣,還有另一個使用JPA 2.0 [休眠3.6.8]的事務。 兩者都需要在單個xa事務中提交。 我想將JBoss AS的[7.1.1]事務管理器用於JTA。
從我的applicationContext.xml>
<!-- injecting jdbc datasource -->
<bean id="CbsTransactionRepository"
class="com.misl.treasury.cbsIntegration.repository.CbsTransactionRepositoryJDBC">
<property name="dataSource" ref="dataSource" />
</bean>
<jee:jndi-lookup id="dataSource" jndi-name="java:/jboss/datasources/CoreDS"/>
<jee:jndi-lookup id="treasuryDataSource" jndi-name="java:/jboss/datasources/TreasuryDS"/>
<!-- JPA entity manager -->
<bean id="treasuryEntityManager"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
<property name="dataSource" ref="treasuryDataSource" />
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="persistenceXmlLocation" value="classpath*:META-INF/hibernatepersistence.xml" />
</bean>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="txManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:jboss/TransactionManager" />
<property name="userTransactionName" value="java:jboss/UserTransaction" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<tx:jta-transaction-manager />
現在,如何在JTA事務管理器的范圍內征集spring jdbc事務,以便可以使用聲明式@Transactional批注從單個方法進行數據訪問?
我的假設是,因為我看不到“數據源”(這是Spring JDBC的數據源)和事務管理器之間的任何鏈接,因此我不得不做一些額外的事情來強制將JDBC事務強制加入JTA事務管理器中。 而且,當我調試時,我還發現Spring JDBC事務一旦離開了simpleJDBCCallobject.execute方法便被提交。 這就是為什么我認為自己做錯了。 實際上,applicationContext配置很好。 我的jndi數據源不是XADatasources! 在JBoss AS 7.1中配置XADatasources時,我不得不使用多個屬性來描述url [而不是單個URL屬性]:
<datasources>
<xa-datasource jndi-name="java:jboss/datasources/TreasuryDS" pool-name="TreasuryDS" enabled="true" use-ccm="false">
<xa-datasource-property name="ServerName">
192.168.1.197
</xa-datasource-property>
<xa-datasource-property name="User">
treasury
</xa-datasource-property>
<xa-datasource-property name="Password">
treasury
</xa-datasource-property>
<xa-datasource-property name="PortNumber">
1521
</xa-datasource-property>
<xa-datasource-property name="DatabaseName">
XE
</xa-datasource-property>
<xa-datasource-property name="DriverType">
thin
</xa-datasource-property>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<driver>OracleJDBCDriver</driver>
<xa-pool>
<is-same-rm-override>false</is-same-rm-override>
<interleaving>false</interleaving>
<pad-xid>false</pad-xid>
<wrap-xa-resource>false</wrap-xa-resource>
</xa-pool>
<security>
<user-name>treasury</user-name>
<password>treasury</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</xa-datasource>
<!---
...... here goes another XA Datasource .....
---->
<drivers>
<driver name="OracleJDBCDriver" module="com.oracle.jdbc">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
</driver>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.