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.

Reply via email to