2012-04-12 5 views
1

appengine java sdk 1.6.4.1 Datanucleus jpa2.0.0 Datanucleus-Cache 3.0.1appengine JPA-Cache-Stufe 2 Leistung ist schlecht

hallo alle

Ich bin mit dem DN-Cache Ebene 2 Plugin.

<property name="datanucleus.cache.level2.type" value="javax.cache"/> 
<property name="datanucleus.cache.level2.cacheName" value="xxxxx"/> 

Ich bemerkte ein Leistungsproblem mit einer direkten Abfrage.

Query query = em.createQuery("Select m.key from MessageUser m " 
       + "where " + " m.userKeyList = :userKey " 
       + "AND m.date > :date ORDER BY m.date DESC"); 

mit dem Cache ON es in 1159 ms ausführen, Cache aus 86 ms.

etwas ist eindeutig falsch. Von der Appstats-Ablaufverfolgung ruft die Cache-Version jede Entität seriell aus Memcache ab.

eine Erklärung, ob dies erwartet wird oder habe ich stopfte?

Cache OFF

(1) 2012-04-12 06:19:38.737 "GET /timeline/status?id=49001&sincedate=1333485300" 200 real=86ms api=0ms overhead=0ms (6 RPCs) 

@11ms datastore_v3.RunQuery real=10ms api=241ms 
@31ms datastore_v3.Get real=7ms api=208ms 
@4ms datastore_v3.BeginTransaction real=4ms api=0ms 
@52ms datastore_v3.Get real=7ms api=8ms 
@65ms datastore_v3.Get real=4ms api=0ms 
@78ms datastore_v3.Commit real=4ms api=0ms 

Cache ON

9) 2012-04-12 05:54:24.385 "GET /timeline/status?id=49001&sincedate=1333485300" 200 real=1159ms api=0ms overhead=0ms (109 RPCs) 
@13ms datastore_v3.RunQuery real=12ms api=241ms 
@28ms memcache.Get real=2ms api=0ms 
@33ms memcache.Get real=2ms api=0ms 
@37ms memcache.Get real=3ms api=0ms 
@42ms memcache.Get real=2ms api=0ms 
@47ms memcache.Get real=2ms api=0ms 
@50ms memcache.Get real=2ms api=0ms 
@54ms memcache.Get real=2ms api=0ms 
@57ms memcache.Get real=2ms api=0ms 
<repeat this for another 50 or60 times 
@3ms datastore_v3.BeginTransaction real=4ms api=0ms 
@1126ms datastore_v3.Get real=5ms api=8ms 
@1134ms memcache.Get real=3ms api=0ms 
@1139ms memcache.Get real=2ms api=0ms 
@1143ms datastore_v3.Get real=4ms api=0ms 
@1153ms datastore_v3.Commit real=3ms api=0ms 

der Code, der die Entität Liste iteriert

List<Message> list = messageDAO.findSinceDate(userKey, sinceDate); 

JSONArray jsonList = new JSONArray(); 

for (Message message : list) { 
item.put("id", message.getKey().getId()); 
    item.put("name", message.getName()); 
} 
+0

Warum nicht Ihren Code, wo Sie auf die Elemente des Abfrageergebnisses zugreifen? wo du sie eins nach dem anderen zugänglich machst? und dann das Protokoll – DataNucleus

+0

@DataNucleus Ich habe den Code hinzugefügt, der die Abfrageergebnisse iteriert. Wie zu sehen ist, wird auf sie in einer Iteration zugegriffen. Was ist das Denken? – lpic

Antwort

0

Die Abfrage-Cache wahrscheinlich nur ist ein Ergebnis-Set Entitätsschlüsseln Caching. Die Entitäten selbst werden dann nachgeschlagen, wenn auf sie zugegriffen wird.

Hier finden Sie weitere Informationen zu Abfragecaches und wie diese die Leistung beeinträchtigen können. Es geht um das Zwischenspeichern von Hibernate L2, aber die Datenkernimplementation ist wahrscheinlich ähnlich. http://tech.puredanger.com/2009/07/10/hibernate-query-cache/