Google App Engine - org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭 [英] Google App Engine - org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed

查看:156
本文介绍了Google App Engine - org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么下面的代码会导致org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭?这个异常似乎是在query.getResultList()引发的。

  public final void removeUserTokens(final String username){
查询query = entityManager.createQuery(
SELECT p FROM PersistentLogin p WHERE username =:username);
query.setParameter(username,username);

for(Object token:query.getResultList()){
entityManager.remove(token);


code

$ b $例外

  org.datanucleus.exceptions.NucleusUserException:Object Manager已关闭
at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
在org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)
at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497)
at org.datanucleus.store。 appengine.query.DatastoreQuery $ 6.apply(DatastoreQuery.java:611)
at org.datanucleus.store.appengine.query.DatastoreQuery $ 6.apply(DatastoreQuery.java:610)
at org.datanucleus。 store.appengine.query.LazyResult.resolveNext(LazyResult.java:94)
at org.datanucleus.store.appengine.query.LazyResult $ LazyAbstractListIterator.computeNext(LazyResult.java:215)
at org。 datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:132)
at org.datanucleus.store.appengine.query.AbstractIterator.hasNext(Abs
at org.datanucleus.store.appengine.query.LazyResult $ AbstractListIterator.hasNext(LazyResult.java:169)
at com.mystuff.service.auth.PersistentTokenRepositoryImpl.removeUserTokens( PersistentTokenRepositoryImpl.java:90)

编辑:我增加了日志级别datanucleus,这就是我所看到的。

  FINE:对象管理器org.datanucleus.ObjectManagerImpl@5d8d3d6c为数据存储打开org .datanucleus.store.appengine.DatastoreManager @ 2447e380
2010年2月25日上午7时21分38秒org.datanucleus.ObjectManagerImpl initialiseLevel1Cache
FINE:1级缓存类型弱初始化
2010年2月25日上午7时21分38秒org.datanucleus.JDOClassLoaderResolver classForName
FINE:在CLASSPATH中找不到类java.lang.PersistentLogin[从org.datanucleus.util.Imports.resolveClassDeclaration调用的类解析器(line = 177)]
2010年2月25日7:21:38 org.datanucleus.ObjectManagerImpl d isconnectSMCache
FINE:清除1级缓存
2010年2月25日7:21:38 org.datanucleus.ObjectManagerImpl postClose
FINE:Object Managerorg.datanucleus.ObjectManagerImpl@5d8d3d6cclosed
Feb 25,2010 7:21:38 AM com.google.apphosting.utils.jetty.JettyLogger警告
警告:/ j_spring_security_logout
对象管理器已关闭
org.datanucleus。异常.NucleusUserException:对象管理器已关闭
at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)


解决方案

添加 @Transactional

Why does the code below result in org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed? The exception appears to be thrown at query.getResultList().

public final void removeUserTokens(final String username) {
    final Query query = entityManager.createQuery(
        "SELECT p FROM PersistentLogin p WHERE username = :username");
    query.setParameter("username", username);

    for (Object token : query.getResultList()) {
        entityManager.remove(token);
    }
}          

Exception:

org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
 at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
 at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)
 at org.datanucleus.store.query.Query.getFetchPlan(Query.java:497)
 at org.datanucleus.store.appengine.query.DatastoreQuery$6.apply(DatastoreQuery.java:611)
 at org.datanucleus.store.appengine.query.DatastoreQuery$6.apply(DatastoreQuery.java:610)
 at org.datanucleus.store.appengine.query.LazyResult.resolveNext(LazyResult.java:94)
 at org.datanucleus.store.appengine.query.LazyResult$LazyAbstractListIterator.computeNext(LazyResult.java:215)
 at org.datanucleus.store.appengine.query.AbstractIterator.tryToComputeNext(AbstractIterator.java:132)
 at org.datanucleus.store.appengine.query.AbstractIterator.hasNext(AbstractIterator.java:127)
 at org.datanucleus.store.appengine.query.LazyResult$AbstractListIterator.hasNext(LazyResult.java:169)
 at com.mystuff.service.auth.PersistentTokenRepositoryImpl.removeUserTokens(PersistentTokenRepositoryImpl.java:90)

Edit: I increased the log level for datanucleus and this is what I see.

FINE: Object Manager "org.datanucleus.ObjectManagerImpl@5d8d3d6c" opened for datastore "org.datanucleus.store.appengine.DatastoreManager@2447e380"
Feb 25, 2010 7:21:38 AM org.datanucleus.ObjectManagerImpl initialiseLevel1Cache
FINE: Level 1 Cache of type "weak" initialised
Feb 25, 2010 7:21:38 AM org.datanucleus.JDOClassLoaderResolver classForName
FINE: Class "java.lang.PersistentLogin" was not found in the CLASSPATH [Class resolver called from org.datanucleus.util.Imports.resolveClassDeclaration (line=177)]
Feb 25, 2010 7:21:38 AM org.datanucleus.ObjectManagerImpl disconnectSMCache
FINE: Level 1 Cache cleared
Feb 25, 2010 7:21:38 AM org.datanucleus.ObjectManagerImpl postClose
FINE: Object Manager "org.datanucleus.ObjectManagerImpl@5d8d3d6c" closed
Feb 25, 2010 7:21:38 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /j_spring_security_logout
Object Manager has been closed
org.datanucleus.exceptions.NucleusUserException: Object Manager has been closed
 at org.datanucleus.ObjectManagerImpl.assertIsOpen(ObjectManagerImpl.java:3876)
 at org.datanucleus.ObjectManagerImpl.getFetchPlan(ObjectManagerImpl.java:376)

解决方案

Adding @Transactional to the method prevents the object manager from closing. However, I'm not sure why it closes without this.

这篇关于Google App Engine - org.datanucleus.exceptions.NucleusUserException:对象管理器已关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆