2013-04-01 50 views
2

使用spring的[3.1] SimpleJdbcCall调用Oracle数据库中的存储过程。 同样,还有另外一个使用JPA 2.0的事务[hibernate 3.6.8]。他们都需要在单个xa事务中承诺。我想使用JTA的JBoss AS [7.1.1]事务管理器。如何在XA事务中引入Spring JDBC事务?

从我的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事务管理的范围之内的弹簧JDBC事务,这样我可以使用数据访问的声明@Transactional注释从一个单一的方法?

回答

0

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