弹簧集成应用程序中的死锁

时间:2015-11-13 12:16:40

标签: spring deadlock

我对旧版应用程序有疑问。 该应用程序有两个上下文,一个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>

1 个答案:

答案 0 :(得分:0)

问题解决了。感谢所有人的回答。

问题是tablas是由外键引用分区的,并且FK没有编入索引,导致Oracle阻塞所有子表的死锁。

我已经为外键创建了所有索引,问题就解决了。