2012-04-12 47 views
1

的AppEngine Java SDK中1.6.4.1 DataNucleus將jpa2.0.0 DataNucleus將緩存3.0.1的AppEngine JPA緩存2級性能差

大家好

我使用DN緩存2級插件。

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

我注意到性能問題與直接查詢。

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

帶緩存打開它在1159毫秒內執行,緩存關閉86毫秒。

明顯是錯誤的。從appstats跟蹤緩存版本是從memcache以串行方式檢索每個實體。

任何解釋是否這是預期或我已經塞滿了?

緩存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 

緩存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 

,遍歷該實體列表

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

爲什麼不把你的代碼放在你訪問查詢結果元素的地方?你在哪裏一一訪問它們?然後日誌 – DataNucleus 2012-04-12 06:50:37

+0

@DataNucleus我已經添加了迭代查詢結果的代碼。可以看出它們在迭代中被訪問。有什麼想法是這個問題? – lpic 2012-04-12 08:25:05

回答

0

查詢緩存大概只能緩存結果集的實體按鍵的代碼。然後,實體本身在被訪問時被查找。

這裏是一些關於查詢緩存的更多信息,以及它們如何確實會降低性能。它是關於Hibernate L2緩存的,但數據覈實現可能類似。 http://tech.puredanger.com/2009/07/10/hibernate-query-cache/