> Some persisted entities are shared between threads, but not
EntityManagers.
This is the root of your problem. EntityManagers and Entities can't be
shared across threads.

Thanks,
Rick

Section 7.2 -- JPA 2.0 Spec
An entity manager must not be shared among multiple concurrently executing
threads, as the entity
manager and *persistence context are not required to be threadsafe*. Entity
managers must only be
accessed in a single-threaded manner.

On Wed, Sep 28, 2011 at 5:38 AM, Tuomas Hynninen <
tuomas.hynni...@surveypal.com> wrote:

> Hi!
>
> I've been getting this error randomly:
>
> <openjpa-2.1.0-r422266:1071316 fatal internal error>
> org.apache.openjpa.util.InternalException: Multiple concurrent threads
> attempted to access a single broker. By default brokers are not thread safe;
> if you require and/or intend a broker to be accessed by more than one
> thread, set the openjpa.Multithreaded property to true to override the
> default behavior.
> at org.apache.openjpa.kernel.BrokerImpl.endOperation(BrokerImpl.java:1935)
> ...
>
> The pattern in my web app is the "entity manager per request" pattern,
> implemented like this:
>
> http://www.uta.fi/~th77842/PersistenceRequestListener.java
> http://www.uta.fi/~th77842/PersistenceManager.java
>
> Basically, I force each request to have its own EntityManager. Some
> persisted entities are shared between threads, but not EntityManagers.
>
> The problem only occurs when it's a Tomcat specific thread (e.g.
> TP-Processor) using an EntityManager. I haven't had the problem using my own
> agent threads or using the ThreadPoolExecutor
> to process jobs. The problem has happened on inserts, selects or accessing
> a field in a persisted entity.
>
> The servlet container I use is Tomcat 6. The database is PostgreSQL 8.1.4.
> JPA related libraries I use: openjpa-2.1.0.jar,
> geronimo-jpa_2.0_spec-1.1.jar, geronimo-jta_1.1_spec-1.1.1.jar.
>
> Persistence configuration:
>
> <properties>
>      <property name="openjpa.jdbc.DBDictionary" value="postgres"/>
>      <property name="openjpa.jdbc.DriverDataSource" value="dbcp"/>
>      <property name="openjpa.ConnectionProperties"
>                value="DriverClassName=org.postgresql.Driver,
>                  Url=jdbc:postgresql://...,
>                  MaxActive=100,
>                  MaxWait=10000,
>                  Username=test,
>                  Password=test"/>
>      <property name="openjpa.ConnectionDriverName"
>                value="org.apache.commons.dbcp.BasicDataSource"/>
>      <property name="openjpa.Log" value="log4j"/>
>      <property name="openjpa.ConnectionFactoryProperties"
>    value="PrettyPrint=true, PrettyPrintLineLength=80,
> PrintParameters=true"/>
>      <property name="openjpa.DataCache" value="false"/>
>      <property name="openjpa.InitializeEagerly" value="true"/>
>      <property name="openjpa.jdbc.SynchronizeMappings"
> value="buildSchema"/>
> </properties>
>
> For the life of me I can't figure out why it's still happening. I am
> certain it's some subtle (or not so subtle) bug in my code or in the
> configuration I've done. I can understand if OpenJPA throws the error on
> persisted entities which are shared between threads, but it shouldn't
> happen on simple inserts.
>
> Any help would be appreciated. Thanks!




-- 
*Rick Curtis*

Reply via email to