2010-02-19 12 views
6

नीचे दिए गए कोड का परिणाम org.datanucleus.exceptions.NucleusUserException: ऑब्जेक्ट मैनेजर बंद कर दिया गया है? अपवाद को query.getResultList() पर फेंक दिया प्रतीत होता है।Google ऐप इंजन - 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

मानते हुए @ ट्रांसेक्शनल वसंतफ्रेमवर्क –

+0

org.springframework.transaction.annotation से है। –

0

मैं क्यों वास्तव में पता नहीं है, लेकिन यह query.getResultList() आलसी-लोडेड होने के साथ क्या करना है लगता है। जाहिर है जब आप remove(token) पर कॉल करते हैं तो आलसी लोडिंग टूट जाती है।

एक कार्य-आसपास के रूप में आप पहले ArrayList में तत्वों के लिए आईडी/कुंजी एकत्र कर सकते हैं, और एक अलग लूप में उन्हें डेटास्टोर से हटा दें?

+0

हममम, अपवाद getResultList() इतना आईडी का संग्रह पर फेंक दिया जाता है/कुंजी अभी भी एक getResultList की आवश्यकता होगी () जो कॉल मुझे लगता है वह असफल हो जाएगा। मुझे लगता है कि स्प्रिंग और जीएई बातचीत करने के तरीके से संबंधित एक बड़ी समस्या है। –

+0

अंतर यह है कि उदाहरण लोड करना (जो होता है जब आप Iterator.hasNext() में परिणाम सूची में पुनरावृत्ति करते हैं, getResultList() में नहीं है) को हटाएं() कॉल के साथ interleaved नहीं किया जाएगा। – Thilo