2014-01-30 4 views
1

У меня есть конфигурация в моем конфигурационном файле весны. Я использую Spring3, Hibernate4 и Tomcat7.настроить менеджер транзакций jta с помощью весны?

<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? Здесь у меня есть wcDataSource и dataSourceKS. Благодаря!

Спасибо!

+3

JTA сложно, в лучшем случае, чтобы работать, особенно при работе с удаленными ресурсами. Ваш источник данных также должен быть удаленным поиском, вероятно, с того же сервера, он должен быть по крайней мере XA-совместимым и должен/должен быть известен базовой реализации JTA tx. Затем вам также нужно будет настроить hibernate соответствующим образом (для стартеров вместо 'datasource' установите' jtaDataSource' в 'LocalSessionFactoryBean'). –

+0

Вы должны взглянуть на эту [ссылку] (http://www.byteslounge.com/tutorials/spring-jta-multiple-resource-transactions-in-tomcat-with-atomikos-example), вот что пытаются делать. (Atomikos является их собственной реализацией jta-менеджера, но весенняя конфигурация будет такой же) –

+0

Arnaud, пожалуйста, укажите ссылку ... – user755806

ответ

1

См. 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> 

Обратите внимание на изменение Викисклада ДБХП в C3P0 не XA способных реализации.

1

не обязательно знать о источнике данных или каких-либо других конкретных ресурсах, поскольку он использует глобальную инфраструктуру управления транзакциями контейнера. Так конф файл должен выглядеть следующим образом

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

Похоже, что? – DavidPostill

Смежные вопросы