首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cayenne缓存-查询缓存替换对象缓存吗?

Cayenne缓存-查询缓存替换对象缓存吗?
EN

Stack Overflow用户
提问于 2015-12-12 19:54:16
回答 1查看 350关注 0票数 1

我正在寻找关于在集群中运行时如何最好地配置cayenne或使用相同域的多个JVM的资源。我一直在阅读这些文档,我看到了以下内容:

有一些方法可以将对象更改通知其他堆栈。这可以在Modeler中设置。但是,每次更改的完全同步往往会导致过多的网络通信量和CPU消耗,并且通常避免采用本章其他部分描述的查询缓存方法。

链接到查询结果缓存页。据我理解,对象缓存是在通过getter检索关联对象或通过id检索对象时使用的。这句话是否告诉我,如果配置查询缓存,就不会使用对象缓存?或者我需要避免这样做会击中我的应用程序代码中的对象缓存?我是否应该完全禁用对象缓存(如果可能的话)?如果我不设置cayenne来通知其他堆栈对对象缓存的更改,难道我就不会冒陈旧数据的风险吗?

我很欣赏关于跨多个节点运行cayenne的最佳方法的所有技巧,或者如果您有一些资源可以指向我,这也将是非常有用的。

提前谢谢你的时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-13 10:41:49

对象缓存和查询缓存是相互独立的,尽管它们会影响彼此的状态。

对象缓存

对象缓存在展开对象图时被访问(正如您正确地注意到的)。但是对象缓存的synchronization不仅更新缓存,而且还传播到ObjectContexts,导致内存中对象图的刷新。虽然这听起来很棒,而且是超级自动的,但从经验来看,它在桌面应用程序中是最有用的,当您有一个与单个用户相关的对象的有限图形时。在集群多用户web应用程序中,同步对象缓存更麻烦,其次是帮助。它创建了大量的网络流量,迫使您的实例使用CPU来处理他们并不关心的事件,最后,在您最不希望的时候从底层更新对象。因此,我通常关闭对象缓存同步,完全依赖集群查询缓存来处理同步。

查询缓存

下面是一个例子项目演示的带有集群的查询缓存。它使用Cayenne4.0,EHCache作为缓存提供程序,ActiveMQ/JMS用于跨实例事件。

按照查询缓存的工作方式,它缓存与给定查询匹配的对象列表,如果查询包含预取,则包括预取相关对象。为了充分利用查询缓存,您可能需要稍微改变编码风格。不必在实例变量中存储对查询结果列表的长期引用(本质上是自己进行缓存),而是在需要查询列表时创建并运行一个查询(具有适当的缓存设置),并让Cayenne决定是从缓存返回列表还是从DB获取新的查询。

下一步是以一种方式配置缓存,这取决于您使用哪个提供者来指定其默认过期策略(每个缓存组)。例如一个示例EHCache配置

最后,您可以添加集群和事件驱动的缓存刷新,这可以通过API调用显式地完成,也可以在某些实体的提交时隐式执行(只有在Cayenne 3.1之后才可用)。

查询缓存刷新非常便宜。通过网络发送的唯一东西是“缓存组”的名称,在接收端,一堆列表被懒惰地立即失效。它还会产生更清晰的代码。

如果要主要依赖查询缓存,则不需要“关闭”对象缓存本身。对象缓存是Cayenne的一个组成部分,是许多操作(更新、关系处理)所必需的。它将在运行查询时自动更新。不过,您通常需要做的是关闭自动对象刷新。通过不启用对象缓存集群,您已经避免了跨JVM同步。此外,您还可以使用这个建议禁用同一VM中的交叉对象cross同步。

卡宴

我强烈建议至少升级到Cayenne3.1(甚至4.0.M2)。其中,缓存机制比3.0更成熟。它将使您的经验配置卡宴和集成外部缓存提供者如此容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34244260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档