谷歌应用引擎java数据存储区缓存JPA查询结果吗?

时间:2012-12-28 22:36:41

标签: google-app-engine jpa google-cloud-datastore jpa-2.0 datanucleus

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

这是我的问题:

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

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

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

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

由于

2 个答案:

答案 0 :(得分:3)

来自Google App Engine: Using JPA with App Engine

  

默认情况下启用Level2缓存。获取先前的默认值   行为,设置持久性属性datanucleus.cache.level2.type   没有。 (或者包括在中的datanucleus-cache插件   classpath,并设置持久性属性   datanucleus.cache.level2.type到javax.cache使用Memcache for L2   缓存。

至于您的怀疑,这取决于您的查询以及DataNucleus和GAE数据存储区适配器实现细节。正如Carol McDonald suggested我认为找到问题答案的最佳途径是使用JPA2 Cache界面...更具体地说是contains方法。

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

启用DataNucleus日志也会为您提供有关幕后发生情况的良好提示。

答案 1 :(得分:3)

在开发本地GAE模式下调试后,我认为二级缓存工作正常。不需要事务开始/提交。我对主键以及em.find()的简单查询结果将通过主键放入缓存中。

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

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

到persistence.xml。

相关问题