[ https://issues.apache.org/jira/browse/ARIES-1083?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Christian Schneider resolved ARIES-1083. ---------------------------------------- Resolution: Fixed Assignee: Christian Schneider Fix Version/s: jpa-2.0.0 In Aries JPA 2 the EntityManagers are stored per thread now. So this should not happen anymore. > Create either a synchronised entity manager or a proxy which creates an > entity manager for each request > ------------------------------------------------------------------------------------------------------- > > Key: ARIES-1083 > URL: https://issues.apache.org/jira/browse/ARIES-1083 > Project: Aries > Issue Type: Improvement > Components: JPA > Affects Versions: jpa-container-context-1.0.1 > Reporter: Joe Qiang Luo > Assignee: Christian Schneider > Fix For: jpa-2.0.0 > > > When using Apache Aries (container managed Transactions, JTA) with Hibernate > for persistence, if we start multiple threads to read from the database > without transactions (Transaction Annotation is ommited), we get the > following stacktrace: > org.hibernate.AssertionFailure: possible non-threadsafe access to the session > at > org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:130) > > at > org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1103) > > at org.hibernate.loader.Loader.processResultSet(Loader.java:960) > at org.hibernate.loader.Loader.doQuery(Loader.java:910) > at > org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) > > at org.hibernate.loader.Loader.doList(Loader.java:2516) > at org.hibernate.loader.Loader.doList(Loader.java:2502) > at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332) > at org.hibernate.loader.Loader.list(Loader.java:2327) > at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490) > at > org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) > > at > org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) > > at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247) > at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) > The reason we got this exception in a non-transacted mode is that we inject > EntityManager in our implementation and use it for different requests from > multiple threads. Unfortunately, the EntityManager is not thread safe and we > have to refactor the code to inject EntityManagerFactory instead since > EntityManagerFactory is thread safe and then create EntityManagers in each > method programmatically. > From Aries stand point, we should be able to improve it in order to ease the > pain by creating a synchronized entity manager, or a proxy which creates > entity managers for each request. And the proxy would probably do the > following: > 1. create EntityManager; > 2. perform request; > 3. close EntityManager; -- This message was sent by Atlassian JIRA (v6.3.4#6332)