Java 使用OpenJPA时ORM中的死锁
当使用运行10的Java 使用OpenJPA时ORM中的死锁,java,jpa,orm,deadlock,openjpa,Java,Jpa,Orm,Deadlock,Openjpa,当使用运行10的soapui执行负载测试时,我遇到了死锁。每个线程向我的web服务发出10个请求,该web服务调用OpenJPA实体管理器的perits方法 然后我执行单个请求,所有请求都结束得很好,但在多线程环境中,它以死锁结束 我得到的错误是: Deadlock found when trying to get lock; try restarting transaction {prepstmnt 12796448 UPDATE Assessment SET dateCompleted =
soapui
执行负载测试时,我遇到了死锁。每个线程向我的web服务发出10个请求,该web服务调用OpenJPA实体管理器的perits方法
然后我执行单个请求,所有请求都结束得很好,但在多线程环境中,它以死锁结束
我得到的错误是:
Deadlock found when trying to get lock; try restarting transaction {prepstmnt 12796448 UPDATE Assessment SET dateCompleted = ? WHERE id = ? [params=?, ?]} [code=1213, state=40001]
由于死锁而崩溃的方法如下:
@Override
public AssessmentKey update(AssessmentKey assessmentKey) {
OpenJPAEntityManager openJpaEntityMgr = OpenJPAPersistence.cast(entityManager);
for (Assessment assessment : assessmentKey.getAssessments()) {
if (!entityManager.contains(assessment) && !openJpaEntityMgr.isDetached(assessment)) {
LOGGER.debug("Persisting {}", assessment);
entityManager.persist(assessment);
}
}
return entityManager.merge(assessmentKey);
}
评估
是OpenJPA的一个实体,它只是一个包含JPA注释的普通实体。
如果你需要它的代码,就要它
我了解死锁是如何发生的,如何解决它们是在中提到的。但如何在ORM中解决这些问题,我无法找到答案
我的persistence.xml
文件如下所示:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="com.groupgti.esb.online.tests">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.groupgti.esb.assessments.model.jpaimpl.Assessment</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<validation-mode>NONE</validation-mode>
<properties>
<property name="openjpa.Log" value="slf4j"/>
<property name="openjpa.DataCache" value="false"/>
<property name="openjpa.ReadLockLevel" value="none"/>
<property name="openjpa.WriteLockLevel" value="pessimistic-write"/>
<property name="openjpa.LockTimeout" value="10000"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
</properties>
</persistence-unit>
</persistence>
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Index
@Column(nullable = false)
@ForeignKey
private AssessmentKey assessmentKey;
在评估中
评估键
如下所示:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="com.groupgti.esb.online.tests">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.groupgti.esb.assessments.model.jpaimpl.Assessment</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<validation-mode>NONE</validation-mode>
<properties>
<property name="openjpa.Log" value="slf4j"/>
<property name="openjpa.DataCache" value="false"/>
<property name="openjpa.ReadLockLevel" value="none"/>
<property name="openjpa.WriteLockLevel" value="pessimistic-write"/>
<property name="openjpa.LockTimeout" value="10000"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
</properties>
</persistence-unit>
</persistence>
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Index
@Column(nullable = false)
@ForeignKey
private AssessmentKey assessmentKey;
Assessment key
和Assessment
是OneToMany
的双向关系。OneToMany
和manytone
注释都具有级联类型。持久化和其他
要点是:
当EntityManager
persistAssessment
时,AssessmentKey
也将保持。您应该需要再次保存或合并AssessmentKey
让我提出以下建议或映射:
AssessmentKey.java
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE},
mappedBy = "assessmentKey", orphanRemoval=true)
private List<Assessment> assessments;
数据库操作
@Override
public AssessmentKey update(AssessmentKey assessmentKey) {
OpenJPAEntityManager openJpaEntityMgr = OpenJPAPersistence.cast(entityManager);
// there may be your operation
return entityManager.merge(assessmentKey);
}
我假设,Assessment
当前AssessmentKey
对象的值可能如下
On System | In Existing Database
ID Description | ID Descrition
1001 AAA => No Changes | 1001 AAA
1002 BBB => Need to update | 1002 BB
null DDD => Need to add | 1003 CCC => need to remove.
当EntityManager合并Assessment key
时,EntityManager
将完成我在上述数据结构中提到的评估的所有过程
注意:确保OneToMany
注释中的orphaneremovation=true
@您能否发布O/R
与Assessment
的关系?