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());
}
为什么不把你的代码放在你访问查询结果元素的地方?你在哪里一一访问它们?然后日志 – DataNucleus 2012-04-12 06:50:37
@DataNucleus我已经添加了迭代查询结果的代码。可以看出它们在迭代中被访问。有什么想法是这个问题? – lpic 2012-04-12 08:25:05