Even though you're not using transactions, I think it's trying to make the .close() call atomic (maybe with an internal implicit transaction), failing or succeeding as a whole. And as I understand it, entities not in the same group can be stored on separate machines so can't be operated on atomically.
I've worked around this by calling a flush() after most any change on a PM-managed object until close(). If this has a huge number of reqs/ s, you may want to re-architect to get the objects in the same entity group as multiple flushes won't be very efficient. -C On Jun 2, 8:26 pm, JD <[email protected]> wrote: > I have a PersistenceManager > > PersistenceManager pm = PMF.get().getPersistenceManager(); > > which I use to do a bunch of operations on different objects, but > WITHOUT transaction (run queries, store entities and lookup entities). > > I then close the manager with pm.close() and get this obscure error > that complains about multiple entity groups inside a transaction even > though I am not using a transaction (you will notice that the error is > not the usual one where it prints the different entity groups). > > I am not 100% confident but have the impression that this error > started happening with the 1.3.4 release. > 100% reproducible use case. Would appreciate input from App Engine > developers. > > com.myapp.servlet.task.PopulateUserPages doAction: Illegal argument > javax.jdo.JDOFatalUserException: Illegal argument > at > org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(Nuc > leusJDOHelper.java: > 344) > at > org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java: > 281) > at com.myapp.dao.jdo.DatastoreService.release(DatastoreService.java: > 631) > at > com.myapp.servlet.AbstractBaseServlet.releaseService(AbstractBaseServlet.ja > va: > 243) > at > com.myapp.servlet.task.PopulateUserPages.doAction(PopulateUserPages.java: > 132) > at com.myapp.servlet.task.Dispatcher.doAction(Dispatcher.java:35) > at com.myapp.servlet.task.TaskServlet.doAction(TaskServlet.java:36) > at > com.myapp.servlet.AbstractBaseServlet.doGenericAction(AbstractBaseServlet.j > ava: > 194) > at > com.myapp.servlet.AbstractBaseServlet.doPost(AbstractBaseServlet.java: > 84) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) > at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: > 511) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1166) > at > com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlo > bUploadFilter.java: > 97) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionF > ilter.java: > 35) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans > actionCleanupFilter.java: > 43) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java: > 388) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: > 216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java: > 182) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: > 765) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java: > 418) > at > com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionH > andlerMap.java: > 238) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java: > 152) > at org.mortbay.jetty.Server.handle(Server.java:326) > at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java: > 542) > at org.mortbay.jetty.HttpConnection > $RequestHandler.headerComplete(HttpConnection.java:923) > at > com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequ > estParser.java: > 76) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) > at > com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceReques > t(JettyServletEngineAdapter.java: > 135) > at > com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java: > 250) > at com.google.apphosting.base.RuntimePb$EvaluationRuntime > $6.handleBlockingRequest(RuntimePb.java:5838) > at com.google.apphosting.base.RuntimePb$EvaluationRuntime > $6.handleBlockingRequest(RuntimePb.java:5836) > at > com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingAp > plicationHandler.java: > 24) > at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java: > 398) > at com.google.net.rpc.impl.Server$2.run(Server.java:852) > at > com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java: > 56) > at > com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpa > nBuilder.java: > 576) > at com.google.net.rpc.impl.Server.startRpc(Server.java:807) > at com.google.net.rpc.impl.Server.processRequest(Server.java:369) > at > com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.j > ava: > 442) > at > com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java: > 319) > at > com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java: > 290) > at com.google.net.async.Connection.handleReadEvent(Connection.java: > 474) > at > com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.j > ava: > 831) > at > com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java: > 207) > at com.google.net.async.EventDispatcher.loop(EventDispatcher.java: > 103) > at > com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java: > 251) > at com.google.apphosting.runtime.JavaRuntime > $RpcRunnable.run(JavaRuntime.java:413) > at java.lang.Thread.run(Unknown Source) > NestedThrowablesStackTrace: > java.lang.IllegalArgumentException: can't operate on multiple entity > groups in a single transaction. > at > com.google.appengine.api.datastore.DatastoreApiHelper.translateError(Datast > oreApiHelper.java: > 34) > at > com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(Datastor > eApiHelper.java: > 67) > at com.google.appengine.api.datastore.DatastoreServiceImpl > $1.run(DatastoreServiceImpl.java:128) > at > com.google.appengine.api.datastore.TransactionRunner.runInTransaction(Trans > actionRunner.java: > 30) > at > com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServic > eImpl.java: > 111) > at > com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServic > eImpl.java: > 84) > at > com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServic > eImpl.java: > 72) > at > org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.ge > t(RuntimeExceptionWrappingDatastoreService.java: > 63) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.get(DatastorePe > rsistenceHandler.java: > 96) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.get(DatastorePe > rsistenceHandler.java: > 106) > at > org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(Da > tastorePersistenceHandler.java: > 530) > at > org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java: > 4576) > at > org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java: > 2814) > at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java: > 2754) > at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java: > 2893) > at > org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java: > 369) > at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256) > at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java: > 801) > at > org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java: > 271) > at com.myapp.dao.jdo.DatastoreService.release(DatastoreService.java: > 631) > at > com.myapp.servlet.AbstractBaseServlet.releaseService(AbstractBaseServlet.ja > va: > 243) > at > com.myapp.servlet.task.PopulateUserPages.doAction(PopulateUserPages.java: > 132) > at com.myapp.servlet.task.Dispatcher.doAction(Dispatcher.java:35) > at com.myapp.servlet.task.TaskServlet.doAction(TaskServlet.java:36) > at > com.myapp.servlet.AbstractBaseServlet.doGenericAction(AbstractBaseServlet.j > ava: > 194) > at > com.myapp.servlet.AbstractBaseServlet.doPost(AbstractBaseServlet.java: > 84) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:713) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) > at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: > 511) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1166) > at > com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlo > bUploadFilter.java: > 97) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionF > ilter.java: > 35) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(Trans > actionCleanupFilter.java: > 43) > at org.mortbay.jetty.servlet.ServletHandler > $CachedChain.doFilter(ServletHandler.java:1157) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java: > 388) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: > 216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java: > 182) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: > 765) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java: > 418) > at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.ha -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
