JPA作为多线程

时间:2014-03-11 08:42:06

标签: java oracle java-ee jpa eclipselink

错误[ACTIVE] ExecuteThread:' 33' for queue:' weblogic.kernel.Default(自我调整)' - 07.02.2014 11:37:20,360 request_id = 9e32efa6-1374-4b1c-99e9-326a3a256b88  错误代码:99错误在异步任务中延迟0:

本地异常堆栈: 异常[EclipseLink-4002](Eclipse Persistence Services - 2.3.2.v20111125-r10461):org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLException:语句已被关闭 错误代码:0 呼叫:SELECT ID,FIRST_NAME,ISBLOCKED,LAST_NAME,MODIFIED,MSISDN,VERSION,OWNER_ID,CONTACT_ID来自联系人(OWNER_ID =?)     bind => [1参数界限] 查询:ReadAllQuery(name =" VasServerfile:/data/msgadmin/wls12c/wlserver_12.1/domains/VAS-MSG-TST-DMN/servers/VAS-MSG-TST-M1-MAN1-1/tmp/_WL_user /VasServer/c7nfil/war/WEB-INF/lib/_wl_cls_gen.jar_VasServerPU" referenceClass =联系sql =" SELECT ID,FIRST_NAME,ISBLOCKED,LAST_NAME,MODIFIED,MSISDN,VERSION,OWNER_ID,CONTACT_ID from CONTACTS WHERE( OWNER_ID =?)")     at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)     在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:644)     在org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:535)     at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1717)     在org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:253)     在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)     在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)     在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)     在org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:646)     at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2611)     在org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2570)     在org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:420)     at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1081)     在org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844)     at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040)     在org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:392)

我正在尝试使用JPA多线程,但我采取了这种例外,任何解决问题的想法。

感谢

2 个答案:

答案 0 :(得分:1)

EntityManager不是线程安全的,因此您应该在单个线程中使用EntityManager实例。在不同的线程中,您可以使用EntityManagerFactory实例,因为它是线程安全的。

答案 1 :(得分:0)

如果你想隔离不同的HTTP线程(我的意思是每个http线程都拥有它自己的entityManager),你有web应用程序就可以使用OpenEntityMangerInView过滤器。

web.xml 片段:

<filter>
    <filter-name>oemInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    <init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>entityManagerFactory</param-value>
    </init-param>
</filter>

您还可以尝试OpenEntityManagerInViewInterceptor:

http://javadox.com/org.springframework/spring-orm/3.2.6.RELEASE/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.html