我正在使用DN3和GAE 1.7.4。 我使用JPA2,默认情况下根据文档启用了Level2缓存。
这是我的问题:
如果我运行一个返回某些对象的查询,这些对象是否会通过其ID自动放入缓存中?
如果我使用已加载了另一个查询em.find()
的对象的id运行createQuery().getResultList()
,它是否可以在缓存中使用?
我是否需要在事务中运行em.find()
或查询才能启动缓存?
我需要澄清一下这个缓存是如何工作的,以及我如何进行查询/查找/持久化,以便充分利用缓存。
由于
答案 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。