我们正在尝试配置一个 Spring 应用程序来处理 JTA 事务。并不是说它失败了,而是我们尝试的一切都只是进行选择并忽略了我们的持久性操作。
正如您在以下日志中看到的,即使保存语句运行,也没有插入语句,也没有异常,也没有错误/警告日志
服务器日志
DEBUG [xxxx.xxxx.persistence] (http--0.0.0.0-8080-1) execute $Proxy363.save(whatever.core.entities.XxxAssignedTime@51a8c542)
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
就像认为应用程序服务器认为一切正常。而如果您检查表,则没有进行插入或更新。
我们打算与 spring 应用程序一起使用的数据源已被运行在同一应用程序服务器中的 Java EE war 应用程序成功地用于 JTA 事务。
由于我们不知道问题可能出在哪里,我想把它放在完整的上下文中。
- 春季 3.1.2-RELEASE
- 休眠 4.1.5.Final
- spring-data-jpa 1.1.1.Final
- 阿帕奇轴1.4
- jboss AS7.1
- 数据库:甲骨文 10g
我们一直在尝试各种疯狂的配置以使其正常工作,所以我将在这里复制最简单的配置。
独立的.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>
[...]
spring-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 事务,所以这不是我第一次这样做,我们一直在寻找我能找到的所有可能的博客和开源项目。然而,在我的应用程序中,任何似乎对每个人都顺利运行的东西似乎都被忽略了。我确信应该是我们在某个地方遗漏了一些非常愚蠢的东西,但到目前为止我们已经尝试了 70 多种不同的配置,但似乎没有一个能做一个简单的插入,否则在不尝试 JTA 时可以正常工作。
(我们使用轴 1.4 的事实可能相关或不相关,但我想告诉您,因为我们的应用程序仅在 Web 服务调用后触发操作)。在这一点上,我们开始相信配置超自然活动......
任何线索任何人?