2

我正在使用DN3和GAE 1.7.4。 我使用JPA2,默认情况下根据文档启用了Level2缓存。谷歌应用程序引擎java datastore缓存JPA查询结果吗?

这里是我的问题:

如果我运行,返回某些对象的查询,将通过他们的ID自动把缓存中的这些对象呢?

如果我运行的em.find()的对象的id已经加载了另一个查询createQuery().getResultList()它会在缓存中可用吗?

我是否需要在事务中运行我的em.find()或查询才能缓存?

我需要澄清一下这个缓存是如何工作的,以及如何做我的查询/发现/持久化以便充分利用缓存。

感谢

回答

3

在开发本地GAE模式下进行调试后,我认为二级缓存有效。无需事务开始/提交。我对主键和em.find()的简单查询的结果将通过它们的主键放入缓存中。

然而,在本地开发服务器的默认缓存超时就像是一个几秒钟,我必须补充一点:

<property name="datanucleus.cache.level2.timeout" value="3600000" /> 

到persistence.xml中。

3

Google App Engine: Using JPA with App Engine

Level2的高速缓存默认情况下启用。要获取先前的默认 行为,请将持久性属性datanucleus.cache.level2.type 设置为none。 (或者包括在 classpath中DataNucleus将缓存插件,并设置持久性属性 datanucleus.cache.level2.type到javax.cache使用内存缓存的L2缓存 。

至于你的疑惑,这取决于你的查询,以及DataNucleus将和GAE数据存储适配器实现细节。作为Carol McDonald suggested我相信,最好的路径找到您的问题的答案与JPA2 Cache接口...更具体地说,contains方法。

运行您查询,通过012访问Cache接口并查看二级缓存contains是否是所需的实体。

启用DataNucleus日志也会给你提供有关幕后发生的事情的好消息。