Spring 中的死锁 - 集成应用程序
DeadLock In Spring-Integration Application
我的旧应用程序有问题。
该应用程序有两个上下文,一个 Spring MVC 上下文和一个 Spring 集成上下文。
Spring MVC 和 Spring 集成有两个独立的实体管理器,但使用相同的@Query 存储库。
应用程序具有高负载数据库访问(用于读取、写入和更新),因为整天接收数百万条 JMS 消息,有时会发生死锁。
如果我将@Lock(OPTIMISTIC) 放在存储库中的所有查询中,问题就解决了,但是 Web 应用程序停止工作“requiredTransactionException”说,这是正常的,因为@Lock 需要事务和 MVC 上下文不要使用事务。
问题是,如何在我的 Spring-Integration entity-manager-factory 中指定 @Lock?
这是我的 Spring- 集成实体管理器:
<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>
问题已解决。谢谢大家的回答。
问题是 tablas 按外键引用分区,FK 没有索引,导致 Oracle 死锁阻塞所有子 table。
我已经为外键创建了所有索引,问题已经解决。
我的旧应用程序有问题。 该应用程序有两个上下文,一个 Spring MVC 上下文和一个 Spring 集成上下文。
Spring MVC 和 Spring 集成有两个独立的实体管理器,但使用相同的@Query 存储库。
应用程序具有高负载数据库访问(用于读取、写入和更新),因为整天接收数百万条 JMS 消息,有时会发生死锁。
如果我将@Lock(OPTIMISTIC) 放在存储库中的所有查询中,问题就解决了,但是 Web 应用程序停止工作“requiredTransactionException”说,这是正常的,因为@Lock 需要事务和 MVC 上下文不要使用事务。
问题是,如何在我的 Spring-Integration entity-manager-factory 中指定 @Lock?
这是我的 Spring- 集成实体管理器:
<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>
问题已解决。谢谢大家的回答。
问题是 tablas 按外键引用分区,FK 没有索引,导致 Oracle 死锁阻塞所有子 table。
我已经为外键创建了所有索引,问题已经解决。