【问题标题】:configure jta transaction manager using spring?使用spring配置jta事务管理器?
【发布时间】:2014-02-22 20:33:27
【问题描述】:

我的 spring 配置文件中有以下配置。我正在使用 Spring3、Hibernate4 和 Tomcat7。

    <jee:jndi-lookup id="wcDataSource" jndi-name="java:comp/UserTransaction" resource-ref="false" environment-ref="remoteEnv" />

    <util:properties id="remoteEnv">
        <prop key="java.naming.provider.url">jnp://jndi.myURL.me:1099</prop>
        <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
        <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
        <prop key="jnp.disableDiscovery">true</prop>
    </util:properties>

   <bean id="dataSourceKS" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${driverClassName}" />
        <property name="jdbcUrl" value="${url}" />
        <property name="user" value="${username}" />
        <property name="password" value="${password}" />
        <!-- pool sizing -->
        <property name="initialPoolSize" value="15" />
        <property name="minPoolSize" value="10" />
        <property name="maxPoolSize" value="20" />
        <property name="acquireIncrement" value="3" />
        <property name="maxStatements" value="6000" />
        <property name="maxStatementsPerConnection" value="300" />

    </bean>

    <bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSourceKS"/>
        <property name="annotatedClasses">
            <list>
                <value>com.sample.MyBean</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.use_sql_comments">true</prop>
                <prop key="hibernate.jdbc.batch_size">50</prop>
            </props>
        </property>
    </bean>

现在我如何在此处配置JTATransactionManager 以使用@Transactional?这里我有wcDataSourcedataSourceKS。谢谢!

谢谢!

【问题讨论】:

  • JTA 最难开始工作,尤其是在使用远程资源时。您的数据源也应该是远程查找,可能来自同一服务器,它应该至少具有 XA 能力,并且应该/必须为底层 JTA tx 实现所知道。接下来,您还需要适当地配置休眠(对于初学者而不是datasourceLocalSessionFactoryBean 上设置jtaDataSource)。
  • 你应该看看这个link,这就是你想要做的。 (Atomikos 是他们自己的 jta 管理器实现,但 spring 配置将是相同的)
  • Arnaud,请提供链接...
  • Arnaud,我需要通过 jndi 查找提供到 AtomikosDataSourceBean 的连接。你能提供一些想法吗?

标签: java spring transactions java-ee-7


【解决方案1】:

JtaTransactionManager 不需要了解 DataSource 或任何其他特定资源,因为它使用容器的全局事务管理基础架构。 所以conf文件应该是这样的

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

【讨论】:

    【解决方案2】:

    请参阅http://lafernando.com/2011/01/05/xa-transactions-with-apache-dbcp/,它在代码中执行,但您应该能够将其转换为弹簧配置。

    这会导致这样的结果。

    <jee:jndi-lookup id="userTransaction" jndi-name="java:comp/UserTransaction" resource-ref="false" environment-ref="remoteEnv" />
    <jee:jndi-lookup id="jtaTransactionManager" jndi-name="java:comp/TransactionManager" resource-ref="false" environment-ref="remoteEnv" />
    
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <constructor-arg ref="userTransaction"/>
        <constructor-arg ref="jtaTransactionManager"/>
    </bean>
    
    <util:properties id="remoteEnv">
        <prop key="java.naming.provider.url">jnp://jndi.myURL.me:1099</prop>
        <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
        <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
        <prop key="jnp.disableDiscovery">true</prop>
    </util:properties>
    
    <bean id="oracleXaDataSource" class="oracle.jdbc.xa.client.OracleXADataSource">
        <property name="user" value="${username}" />
        <property name="password" value="${password}" />
        <property name="url" value="${url}" />
    </bean>
    
    <bean id="dataSourceKS" class="org.apache.commons.dbcp.managed.BasicManagedDatasource">
        <property name="transactionManager" ref="jtaTransactionManager" />
        <property name="xaDataSourceInstance" ref="oracleXaDataSource" />
        <property name="initialPoolSize" value="15" />
        <property name="minPoolSize" value="10" />
        <property name="maxPoolSize" value="20" />
        <property name="acquireIncrement" value="3" />
        <property name="maxStatements" value="6000" />
        <property name="maxStatementsPerConnection" value="300" />
    </bean>
    
    <bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="jtaDataSource" ref="dataSourceKS"/>
        // .. other hibernate properties
    </bean>
    

    请注意对 commons-dbcp 的更改,因为 c3p0 没有支持 XA 的实现。

    【讨论】:

    • 链接失效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多