簡體   English   中英

如何在XA事務中征集Spring JDBC事務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM