我对旧版应用程序有疑问。 该应用程序有两个上下文,一个Spring MVC上下文和一个Spring Integration上下文。
Spring MVC和Spring Integration有两个独立的Entity Manager,但使用相同的@Query存储库。
应用程序具有高负载数据库访问权限(用于读取,写入和更新),因为它总是接收数百万条JMS消息,有时会发生DEADLOCK。
如果我将@Lock(OPTIMISTIC)放在存储库中的所有Querys中,问题就解决了,但是Web应用程序停止工作“requiredTransactionException”说,这是正常的,因为@Lock需要一个Transaction和MVC context over'使用交易。
问题是,¿如何在我的Spring-Integration实体经理工厂中指定@Lock?
这是我的Spring-Integration实体经理:
<bean id="entity-manager-factory" parent="entity-manager-factory-parent" depends-on="springJtaPlatformAdapter">
<property name="dataSource" ref="dataSourceInt" />
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.transactionType" value="JTA" />
<entry key="hibernate.current_session_context_class" value="jta" />
<entry key="hibernate.transaction.jta.platform" value="XXXXXXXXX (InternalClass, I Can't show name)" />
<entry key="hibernate.connection.autocommit" value="false" />
</map>
</property>
编辑:
父实体经理:
<bean id="entity-manager-factory-parent" abstract="true"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="es.com.bbdd.entities" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.default_schema">SALES_SCHEMA</prop>
</props>
</property>
答案 0 :(得分:0)
问题解决了。感谢所有人的回答。
问题是tablas是由外键引用分区的,并且FK没有编入索引,导致Oracle阻塞所有子表的死锁。
我已经为外键创建了所有索引,问题就解决了。