2012-09-06 3 views
1

Мы пытаемся настроить приложение Spring для работы с транзакциями JTA. Это не похоже на неудачу, но все, что мы пробовали, просто делает выбор и игнорирует наши операции настойчивости.Невозможно сделать работу JTA на jboss AS7.1 с пружиной 3.1

Как вы можете видеть в следующих журналах, даже несмотря на то сохранить заявление перспективы нет вставки заявления, ни исключение, ни с чем не журналы ошибок/предупреждения

server.log

DEBUG [xxxx.xxxx.persistence] (http--0.0.0.0-8080-1) execute $Proxy363.save([email protected]) 
DEBUG [org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource] (http--0.0.0.0-8080-1) Adding transactional method 'save' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 
DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] (http--0.0.0.0-8080-1) Returning cached instance of singleton bean 'transactionManager' 
DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (http--0.0.0.0-8080-1) Participating in existing transaction 
INFO [xxxx.xxxx.impl.BpmnUserBusinessImpl] (http--0.0.0.0-8080-1) Last Assigned Time Updated to *******, Thu Sep 06 15:48:48 ICT 2012 

Это похоже, что сервер приложений считает, что все пошло правильно. Если вы проверили таблицу, не было внесено никаких изменений или изменений.

Источник данных, который мы намерены использовать с весенним приложением, успешно используется с транзакциями JTA при помощи военного приложения Java EE, работающего на том же сервере приложений.

Поскольку мы понятия не имеем, где может быть проблема, я бы хотел поставить все это в полном контексте.

  • пружина 3.1.2-RELEASE
  • спящий режим 4.1.5.Final
  • весенне-данных JPA 1.1.1.Final
  • апаша ось 1.4
  • JBoss AS7.1
  • DB: oracle 10g

Мы пробовали все виды сумасшедшей конфигурации, чтобы попытаться заставить его работать, поэтому я просто скопирую h это самый простой.

standalone.xml

<datasource jta="true" jndi-name="java:jboss/datasources/EngineDS" pool-name="EngineDS" enabled="true" use-java-context="true" use-ccm="true"> 
    <connection-url>jdbc:oracle:thin:@server:port:****</connection-url> 
    <driver>oracle</driver> 
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> 
    <pool> 
     <min-pool-size>10</min-pool-size> 
     <max-pool-size>100</max-pool-size> 
     <prefill>true</prefill> 
    </pool> 
    <security> 
     <user-name>****</user-name> 
     <password>****</password> 
    </security> 
    <statement> 
     <prepared-statement-cache-size>32</prepared-statement-cache-size> 
     <share-prepared-statements>true</share-prepared-statements> 
    </statement> 
</datasource> 
<drivers> 
    <driver name="oracle" module="com.oracle.ojdbc6"> 
     <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> 
    </driver> 
</drivers> 

web.xml

[...] 
<resource-ref id="DS"> 
<res-ref-name>EngineDS</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
<res-sharing-scope>Shareable</res-sharing-scope> 
<mapped-name>java:jboss/datasources/EngineDS</mapped-name> 
</resource-ref> 
[...] 

весна-JPA-config.xml

<jpa:repositories base-package="whatever.core.repositories" /> 
<jee:jndi-lookup id="dataSource" jndi-name="EngineDS" cache="true" resource-ref="true" expected-type="javax.sql.DataSource"/> 
<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
<property name="packagesToScan" value="whatever.core.entities" /> 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <property name="showSql" value="${hibernate.show_sql}" /> 
    <property name="generateDdl" value="${jpa.generateDdl}" /> 
    <property name="databasePlatform" value="${jpa.dialect}" /> 
    </bean> 
    </property> 
</bean> 

<tx:annotation-driven /> 
<tx:jta-transaction-manager /> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
<bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/> 

Мы сделали в прошлом JBoss AS5/Spring приложений 3.0 для работы с транзакциями JTA, так что это не так, как в первый раз, когда я это делаю, и мы искали все возможные варианты gs и проекты с открытым исходным кодом, которые я мог найти. Но все, что кажется гладким для всех, похоже, игнорируется в моем приложении. Я уверен, что должно быть, что мы чего-то действительно глупым, но мы уже пробовали до 70+ разных конфигураций, и ни одна из них не выглядит простой вставкой, которая в противном случае работает, когда вы не пытаетесь использовать JTA.

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

Любые подсказки кого-нибудь?

ответ

1

Оказалось, что указанная выше конфигурация не работает из-за того, что я использовал org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.

Чтобы JTA я Lookup для JBoss управляемого контейнера диспетчера объектов spring-jpa.config.xml:

<!-- lookup the container-managed JPA-EMF --> 
<!-- the JNDI name is specified in META-INF/persistence.xml --> 
<!-- SEE: https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-BindingEntityManagerFactorytoJNDI --> 
<jee:jndi-lookup id="defaultPu" jndi-name="java:jboss/defaultPu" /> 

И в META-INF/persistence.xml вы связать Entity менеджер завод в JNDI:

<!-- bind the EMF in JNDI --> 
<property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/defaultPu" /> 

Итак, я пусть Jboss загрузочный JPA, и таким образом транзакции JTA работают!