2 Stimmen

Auf Google App Engine erhalte ich eine InvocationTargetException, wenn ich den Datenspeicher zum ersten Mal nach dem Starten des Dev-Servers abfrage

Auf Google App Engine erhalte ich jedes Mal, wenn ich den Entwicklungsserver starte, mehrere java.lang.reflect.InvocationTargetException. Ich verwende Spring MVC 3.0.

Meine Anwendung funktioniert gut, aber ich habe das Gefühl, dass die Ausnahme die Startzeit des Entwicklungsservers verlangsamt, und ich bin nicht sicher, ob die Ausnahme auch auf dem echten Server auftritt und die Startzeit verlangsamt, wenn GAE eine neue Instanz startet.

Die Ausgabe ist:

 [java] The server is running at http://localhost:8080/
 [java] Jan 21, 2010 4:16:52 PM com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue <init>
 [java] INFO: Failed to start reference finalizer thread. Reference cleanup will only occur when new references are created.
 [java] java.lang.reflect.InvocationTargetException
 [java]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [java]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 [java]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 [java]         at java.lang.reflect.Method.invoke(Method.java:597)
 [java]         at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100)
 [java]         at com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue.<init>(FinalizableReferenceQueue.java:124)
 [java]         at com.google.appengine.repackaged.com.google.common.labs.misc.InterningPools$WeakInterningPool.<clinit>(InterningPools.java:104)
 [java]         at com.google.appengine.repackaged.com.google.common.labs.misc.InterningPools.newWeakInterningPool(InterningPools.java:48)
 [java]         at com.google.appengine.repackaged.com.google.io.protocol.ProtocolSupport.<clinit>(ProtocolSupport.java:55)
 [java]         at com.google.apphosting.api.DatastorePb$Query.<init>(DatastorePb.java:1072)
 [java]         at com.google.apphosting.api.DatastorePb$Query$1.<init>(DatastorePb.java:2355)
 [java]         at com.google.apphosting.api.DatastorePb$Query.<clinit>(DatastorePb.java:2355)
 [java]         at com.google.appengine.api.datastore.QueryTranslator.convertToPb(QueryTranslator.java:28)
 [java]         at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl.convertToPb(DatastoreServiceImpl.java:382)
 [java]         at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl.runQuery(DatastoreServiceImpl.java:342)
 [java]         at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl.access$100(DatastoreServiceImpl.java:272)
 [java]         at com.google.appengine.api.datastore.DatastoreServiceImpl$PreparedQueryImpl$1.iterator(DatastoreServiceImpl.java:306)
 [java]         at org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterable.iterator(RuntimeExceptionWrappingIterable.java:42)
 [java]         at org.datanucleus.store.appengine.query.StreamingQueryResult.<init>(StreamingQueryResult.java:77)
 [java]         at org.datanucleus.store.appengine.query.DatastoreQuery.newStreamingQueryResultForEntities(DatastoreQuery.java:324)
 [java]         at org.datanucleus.store.appengine.query.DatastoreQuery.fulfillEntityQuery(DatastoreQuery.java:310)
 [java]         at org.datanucleus.store.appengine.query.DatastoreQuery.performExecute(DatastoreQuery.java:242)
 [java]         at org.datanucleus.store.appengine.query.JDOQLQuery.performExecute(JDOQLQuery.java:84)
 [java]         at org.datanucleus.store.query.Query.executeQuery(Query.java:1489)
 [java]         at org.datanucleus.store.query.Query.executeWithArray(Query.java:1371)
 [java]         at org.datanucleus.store.query.Query.execute(Query.java:1344)
 [java]         at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:221)
 [java]         at app.controllers.RootController.Index(RootController.java:30)

EDIT: Es stellte sich heraus, dass es passiert, wenn meine Indexseite eine einfache SELECT-Datenspeicherabfrage ausführt. Aber es passiert immer noch nur direkt nach dem Start des Entwicklungsservers. Wenn ich die Indexseite aktualisiere oder andere Abfragen ausführe, tritt die Ausnahme nicht mehr auf.

Hier ist die Abfrage, die bei der ersten Ausführung die Ausnahme verursacht.

Query q = pm.newQuery(Question.class);
List<Question> cards = (List<Question>) q.execute();

1voto

Mike Sherov Punkte 13022

Ich glaube, dass es sich dabei um eine "CAUGHT and handled"-Ausnahme handelt. Wenn Sie hier schauen: http://www.google.com/codesearch/p?hl=en#YXcrkXezIpQ/trunk/src/com/google/common/base/FinalizableReferenceQueue.java

werden Sie sehen, dass queue wird immer noch in Zeile 134 erstellt. Ich werde ein bisschen mehr suchen, um zu sehen, ob es eine andere Möglichkeit gibt, dies besser zu handhaben, aber ich weiß nicht, ob das explizit die Ursache für Ihre Langsamkeit ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X