2015-02-06 5 views
1

В настоящее время наше приложение использует источник данных, который определен в файле JBoss standalone.xml, и в основном нам нужно, чтобы это было определено в приложении, а не в контейнере какое-то время. Наша текущая настройка;Определение источника данных jta за пределами контейнера

application-context.xml;

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
     <property name="persistenceUnitName" value="rtsPersistenceUnit" /> 
     <property name="packagesToScan"> 
      ... 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="database" value="ORACLE" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect"/> 
      </bean> 
     </property> 
</bean> 

persistance.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 

    <persistence-unit name="rtsPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 

     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <jta-data-source>java:/jdbc/RTSdb</jta-data-source> 

     <class>...</class> 

     <exclude-unlisted-classes>true</exclude-unlisted-classes> 

     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 
      <property name="hibernate.transaction.flush_before_completion" value="true" /> 
     </properties> 

    </persistence-unit> 

</persistence> 

datasource.xml:

<bean id="rtsDatasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/> 
    <property name="url" value="..."/> 
    <property name="username" value="..."/> 
    <property name="password" value="..."/> 
</bean> 

В принципе все, что я хочу для линии

<jta-data-source>java:/jdbc/RTSdb</jta-data-source> 

читать из datasource.xml а не идти в контейнер (JBoss). Кажется, что это было бы просто, но после чтения некоторых документов Spring и Oracle я не смог найти ответ.

ответ

2

Да, вы можете использовать JTA-совместимый менеджер транзакций, такой как Atomikos или Bitronix. На их соответствующих сайтах есть документация о том, как настроить их с помощью Spring. В общем, вы должны следовать инструкциям ниже (при использовании Atomikos):

  1. Сохранить существующий источник XA данных (rtsDatasource в вашем случае) или создать, если уже не используется (например, если кто-то есть источник данных, отличных от XA, источник данных должен быть сначала преобразован в источник данных XA).
  2. Оберните источник данных XA в AtomikosDataSourceBean.
  3. Наведите свой EntityManagerFactory на новый экземпляр AtomikosDataSourceBean.
  4. Объявление менеджера транзакций XA и транзакции пользователя XA.
  5. Оберните диспетчер транзакций XA весной JtaTransactionManager.
  6. Используйте пружину JtaTransactionManager.

Ниже приведен короткий фрагмент конфигурации с использованием базы данных H2, Hibernate 4, Spring 4 и Atomikos 4.

<bean class="org.h2.jdbcx.JdbcDataSource" id="originalDataStore" lazy-init="true">...</bean> 

<bean class="com.atomikos.jdbc.AtomikosDataSourceBean" id="dataSource" init-method="init" destroy-method="close"> 
    <property name="uniqueResourceName" value="xaDS"/> 
    <property name="xaDataSource" ref="originalDataStore"/> 
    <property name="poolSize" value="3"/> 
</bean> 

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.transaction.jta.platform">com.atomikos.icatch.jta.hibernate4.AtomikosPlatform</prop> 
     ... 
    </props> 
    </property> 
</bean> 

<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager"> 
    <property name="transactionManager"> 
    <bean class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> 
     <property name="forceShutdown" value="false"/> 
    </bean> 
    </property> 
    <property name="userTransaction"> 
    <bean class="com.atomikos.icatch.jta.J2eeUserTransaction"> 
     <property name="transactionTimeout" value="300"/> 
    </bean> 
    </property> 
    <property name="allowCustomIsolationLevels" value="true"/> 
</bean> 

<transaction:annotation-driven transaction-manager="transactionManager"/> 

Для получения дополнительной информации вы можете найти this app.