[hibernate-dev] HHH-7265/HSEARCH-1087 ConcurrentModificationException

Steve Ebersole steve at hibernate.org
Wed Apr 25 11:06:38 EDT 2012


My immediate thought would be to leverage Session's notion of auto 
closing after transaction 
(org.hibernate.cfg.Settings#isAutoCloseSessionEnabled).  That is all 
the Synchronization in EntityManagerImpl is doing.

Those hooks are already in place, maybe just add a way for 
EntityManager to tell Session it should be auto closed.  Currently that 
is set up front via a boolean (SessionImpl#autoCloseSessionEnabled).  
We would instead need a delegation there.  Or maybe just pass 
discardOnClose as autoCloseSessionEnabled if the JPA transaction type 
is JTA; if no transaction is active when EM.close() EM.close would 
still close the Session immediately (that code is there already), but 
thats ok because there would be no synchronization registered with the 
actual JTA platform.

Not sure about Search.

On Wed 25 Apr 2012 01:41:39 AM CDT, Gail Badner wrote:
> Scott has verified that the failure he is seeing involves 2 synchronizations. The first is from EntityManagerImpl and the second is HSearch.
>
> The problem is that the EntityManagerImpl (anonymous) Synchronization.afterCompletion() closes the session, which in turn, calls TransactionCoordinatorImpl.close() which calls reset(), which clears the synchronizations from the registry. After that finishes, SynchronizationRegistryImpl.notifySynchronizationsAfterTransactionCompletion() attempts to execute HSearch afterCompletion() synchronization, but the registry has already been cleared, resulting in the ConcurrentModificationException.
>
> I initially thought a possible fix would be to defer calling TransactionCoordinatorImpl.reset() if the afterCompletion() synchronizations are being executed. Doing this would be fairly straightforward.
>
> The problem is that, since the EntityManager afterCompletion() synchronization is executed first, the session would be closed before the HSearch afterCompletion() synchronization is executed. I mentioned this to Sanne and he said that the HSearch afterCompletion() synchronization might need access to the persistence context to, for example, initialize a collection, or to get entity state. Obviously it can't if the session is already closed.
>
> Is there a reason why the EntityManager synchronization is registered before the HSearch synchronization?
>
> Is there a way to always make the "session-closing" synchronization last?
>
> Steve, do you see a better way around this?
>
> Thanks,
> Gail
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev

--
steve at hibernate.org
http://hibernate.org


More information about the hibernate-dev mailing list