[
https://issues.apache.org/jira/browse/OPENJPA-1716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13423472#comment-13423472
]
David Minor commented on OPENJPA-1716:
--------------------------------------
Yes. From my understanding, the broker and the state manager used to share the
same lock, but for performance reasons separate locks were introduced. The
deadlock in this JIRA is the result of those locks being acquired in a
different order depending on the call path.
I'm a little fuzzy on where entity managers fit in, and how I should go about
making my application immune to these problems. If I'm storing an entity in the
user's session or in a cache somewhere, do I call the new detach() first so
that cross-thread field access doesn't interact with the broker? Or is there
some other thing I'm missing?
> Deadlock with openjpa.Multithreaded=true
> ----------------------------------------
>
> Key: OPENJPA-1716
> URL: https://issues.apache.org/jira/browse/OPENJPA-1716
> Project: OpenJPA
> Issue Type: Bug
> Affects Versions: 2.0.0-M1, 2.0.0-M2, 2.0.0-M3, 2.0.0-beta, 2.0.0-beta2,
> 2.0.0-beta3, 2.0.0
> Reporter: Stefan Wokusch
> Assignee: Rick Curtis
> Attachments: OPENJPA-1716.PATCH, deadlock-fix-OPENJPA-1716.patch.txt
>
>
> There is a Deadlock by using Multithreaded=true and work with some Threads on
> the same Entitymanager.
> After many hours of debugging, i found a solution for that Deadlock: The
> Problem could be solved by adding another lock into the lock Method of the
> StateManagerImpl:
> StateManagerImpl ~line3308
> /**
> * Lock the state manager if the multithreaded option is set.
> */
> protected void lock() {
> if (_instanceLock != null){
> _broker.lock();//<- This is the new Part to fix the Deadlock
> _instanceLock.lock();
> }
> }
> Worked for me without Problems for a long time.
> Some other Configurations:
> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
> <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
> <mapping-file>orm.xml</mapping-file>
>
> <class>...</class>
> <class>...</class>
>
> <properties>
> <property name="openjpa.OrphanedKeyAction"
> value="log(Channel=Orphans, Level=TRACE)" />
> <property name="openjpa.ConnectionFactoryProperties"
> value="PrettyPrint=true, PrettyPrintLineLength=80" />
> <property name="openjpa.Multithreaded" value="true" />
> <property name="openjpa.InverseManager" value="true" />
> <property name="openjpa.LockManager" value="none" />
> <property name="openjpa.WriteLockLevel" value="none" />
> <property name="openjpa.Compatibility" value="
> QuotedNumbersInQueries=true,
> CopyOnDetach=true,
> cascadeWithDetach=true,
>
> superclassDiscriminatorStrategyByDefault=false
> " />
> <property name="openjpa.DetachState"
> value="fetch-groups" />
> <property name="openjpa.jdbc.SynchronizeMappings"
> value="buildSchema" />
> <!-- Default DataSource -->
> <property name="openjpa.ConnectionURL"
> value="jdbc:h2:db/test" />
> <property name="openjpa.ConnectionDriverName"
> value="org.h2.Driver" />
> </properties>
> </persistence-unit>
> </persistence>
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira