【问题标题】:How to enlist spring JDBC transaction within a XA-transaction?如何在 XA 事务中登记 Spring JDBC 事务?
【发布时间】:2013-04-01 07:06:51
【问题描述】:

使用 spring 的 [3.1] SimpleJdbcCall 调用 Oracle db 中的存储过程。 同样,还有另一个使用 JPA 2.0 [hibernate 3.6.8] 的事务。它们都需要在单个 xa 事务中提交。我想为 JTA 使用 JBoss AS 的 [7.1.1] 事务管理器。

来自我的 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 jpa jdbc jboss jta


    【解决方案1】:

    我的假设是因为我没有看到“数据源”[这是 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 2011-09-02
      • 2017-09-30
      • 1970-01-01
      • 2011-05-01
      • 2015-05-26
      • 1970-01-01
      • 2013-04-11
      相关资源
      最近更新 更多