Return-Path: X-Original-To: apmail-openjpa-dev-archive@www.apache.org Delivered-To: apmail-openjpa-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4C81410527 for ; Wed, 27 Nov 2013 20:19:37 +0000 (UTC) Received: (qmail 3357 invoked by uid 500); 27 Nov 2013 20:19:37 -0000 Delivered-To: apmail-openjpa-dev-archive@openjpa.apache.org Received: (qmail 3181 invoked by uid 500); 27 Nov 2013 20:19:35 -0000 Mailing-List: contact dev-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list dev@openjpa.apache.org Received: (qmail 3156 invoked by uid 99); 27 Nov 2013 20:19:35 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 27 Nov 2013 20:19:35 +0000 Date: Wed, 27 Nov 2013 20:19:35 +0000 (UTC) From: "Cedric Tabin (JIRA)" To: dev@openjpa.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Created] (OPENJPA-2460) NoClassDefFound after ~1000 insertions followed by a dynamic select query MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 Cedric Tabin created OPENJPA-2460: ------------------------------------- Summary: NoClassDefFound after ~1000 insertions followed by a dynamic select query Key: OPENJPA-2460 URL: https://issues.apache.org/jira/browse/OPENJPA-2460 Project: OpenJPA Issue Type: Bug Components: jpa Affects Versions: 2.2.2 Environment: Java EE 6 / glassfish 3.1.2.2 / MySQL Reporter: Cedric Tabin OpenJPA loses a class after ~1000 persist followed by a dynamic query. Consider the following lines:
Integer maxId = (Integer)entityManager.createQuery("SELECT MAX(p.id) FROM Person p").getSingleResult();
if (maxId==null) { maxId = 0; }
        
Integer pid = maxId+1;
Person np = new Person(pid, null, name, firstname);
entityManager.persist(np);
        
entityManager.createQuery("SELECT p FROM Person p WHERE p.id="+pid).getSingleResult();
After running this code ~1000 times, I have the following exception:
Caused by: java.lang.NoClassDefFoundError: org/apache/openjpa/lib/util/concurrent/ConcurrentReferenceHashMap$SoftEntry
	at org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap.newEntry(ConcurrentReferenceHashMap.java:402)
	at org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap.put(ConcurrentReferenceHashMap.java:386)
	at org.apache.openjpa.util.CacheMap.put(CacheMap.java:174)
	at org.apache.openjpa.util.CacheMap.cacheMapOverflowRemoved(CacheMap.java:150)
	at org.apache.openjpa.util.CacheMap$2.overflowRemoved(CacheMap.java:128)
	at org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap.removeOverflow(ConcurrentHashMap.java:358)
	at org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:343)
	at org.apache.openjpa.util.CacheMap.put(CacheMap.java:174)
	at org.apache.openjpa.util.CacheMap.put(CacheMap.java:395)
	at java.util.Collections$SynchronizedMap.put(Collections.java:2041)
	at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:662)
	at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:620)
	at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:682)
	at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:589)
	at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:997)
	at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:979)
	at org.apache.openjpa.persistence.EntityManagerImpl.createQuery(EntityManagerImpl.java:102)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:436)
	at ch.astorm.ejb.facade.EntryPointBean.privateInsert(EntryPointBean.java:51)
	at ch.astorm.ejb.facade.EntryPointBean.insertWithTransaction(EntryPointBean.java:32)
After looking at the log, we can see a big WARNING just before the first error is thrown:
WARNING: LDR5207: ASURLClassLoader EarLibClassLoader : 
doneCalled = true
doneSnapshot = ASURLClassLoader.done() called ON EarLibClassLoader : 
urlSet = [...]
doneCalled = false 
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@6dd938f0
 AT Wed Nov 27 21:09:54 CET 2013 
 BY :java.lang.Throwable: printStackTraceToString
	at com.sun.enterprise.util.Print.printStackTraceToString(Print.java:639)
	at com.sun.enterprise.loader.ASURLClassLoader.done(ASURLClassLoader.java:211)
	at com.sun.enterprise.loader.ASURLClassLoader.preDestroy(ASURLClassLoader.java:179)
	at org.glassfish.javaee.full.deployment.EarClassLoader.preDestroy(EarClassLoader.java:114)
	at org.glassfish.deployment.common.DeploymentContextImpl.getClassLoader(DeploymentContextImpl.java:236)
	at org.glassfish.deployment.common.DeploymentContextImpl.getClassLoader(DeploymentContextImpl.java:186)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:450)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
	at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
	at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:744)
 Parent -> org.glassfish.internal.api.DelegatingClassLoader@6dd938f0
 was requested to find class org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap$SoftEntry after done was invoked from the following stack trace
After the first error is thrown, it seems that one request over two is working, probably depending on which EntityManager is injected. After reading the source code and making many tests, it seems that it is caused by the compilation cache: after a given number of [dynamic] query, it crashes because of the ClassLoader has changed. I found two solutions to avoid this problem: 1) use a parametrizer query: entityManager.createQuery("SELECT p FROM Person p WHERE p.id=?1").setParameter(1, pid).getSingleResult(); 2) change the compilation cache policy to either 'false' or 'all' as described here: http://ci.apache.org/projects/openjpa/1.0.x/manual/ref_guide_cache_querycomp.html -- This message was sent by Atlassian JIRA (v6.1#6144)