2

我正在使用 DN3 和 GAE 1.7.4。我使用 JPA2,根据文档,默认情况下启用了 Level2 缓存。

这是我的问题:

如果我运行一个返回一些对象的查询,这些对象是否会通过它们的 ID 自动放入缓存中?

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

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

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

谢谢

4

2 回答 2

3

来自Google App Engine:将 JPA 与 App Engine 结合使用

默认情况下启用二级缓存。要获得以前的默认行为,请将持久性属性 datanucleus.cache.level2.type 设置为 none。(或者在类路径中包含 datanucleus-cache 插件,并将持久性属性 datanucleus.cache.level2.type 设置为 javax.cache 以使用 Memcache 进行 L2 缓存。

至于您的疑问,这取决于您的查询以及 DataNucleus 和 GAE Datastore 适配器实现细节。正如Carol McDonald 所建议的那样,我相信找到问题答案的最佳途径是使用 JPA2 Cache接口......更具体地说是contains方法。

运行您的查询,通过 访问Cache界面EntityManagerFactory并查看 2 级是否缓存contains了所需的实体。

启用DataNucleus日志还将为您提供有关幕后发生的事情的良好提示。

于 2012-12-28T23:07:39.223 回答
3

在开发本地 GAE 模式下调试后,我发现 2 级缓存可以工作。无需交易开始/提交。我对主键以及 em.find() 的简单查询的结果将通过它们的主键放入缓存中。

然而,本地开发服务器中的默认缓存超时就像几秒钟,我不得不添加这个:

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

到persistence.xml。

于 2012-12-30T11:20:11.047 回答