2010-02-19 2 views
6

아래 코드가 org.datanucleus.exceptions.NucleusUserException의 결과로 나타나는 이유는 무엇입니까? Object Manager가 닫혀 있습니까? 예외는 query.getResultList()에서 throw 된 것으로 보입니다.Google App Engine - org.datanucleus.exceptions.NucleusUserException : 객체 관리자가 닫혔습니다.

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); 
    } 
}   

예외 :

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) 

편집 : 나는 datanucleus의 로그 수준을 증가 이것이 내가 볼 것입니다.

FINE: Object Manager "[email protected]" opened for datastore "[email protected]" 
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 "[email protected]" 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) 

답변

3

@Transactional을 메서드에 추가하면 개체 관리자가 닫히지 않습니다. 그러나, 나는 이것이 왜 이것없이 끝나는 지 확신하지 못한다.

+1

@Transactional이 springframework에서 온다고 가정하십시오. –

+0

org.springframework.transaction.annotation.Transactional –

0

나는 이유는 정확히 모르겠지만, query.getResultList() 게으른 -로드와 함께 할 것 같다. remove(token)으로 전화하면 게으른로드가 중단됩니다.

해결 방법으로 먼저 ArrayList의 요소에 대한 ID/키를 수집 할 수 있으며 별도의 루프에서 데이터 저장소에서 요소를 제거 할 수 있습니까?

+0

흠, 예외가 getResultList() 그래서 ID를 수집 던져/키 여전히 getResultList을 요구 () 내가 실패했다고 가정하는 전화. 저는 Spring과 GAE가 상호 작용하는 방식과 관련된 더 큰 문제가있는 것처럼 느낍니다. –

+0

차이점은 인스턴스로드 (getResultList()가 아닌 Iterator.hasNext()의 결과 목록을 반복 할 때 발생 함)가 remove() 호출과 인터리브되지 않는다는 것입니다. – Thilo