Java Cayenne缓存-查询缓存是否替换对象缓存?

Java Cayenne缓存-查询缓存是否替换对象缓存?,java,apache-cayenne,Java,Apache Cayenne,我正在寻找有关如何在群集中或使用同一域的多个JVM中最佳配置cayenne的资源。我一直在阅读文档,我看到: 有几种方法可以将对象更改通知其他堆栈。这可以在Modeler中进行设置。但是,每次更改的完全同步通常会导致网络流量和CPU消耗过多,通常会避免这种情况,而本章其他部分介绍的查询缓存方法会更有效 链接到查询结果缓存页面的。我的理解是,当通过getter检索关联对象或通过其id检索对象时,会使用对象缓存。这句话是否告诉我,如果配置查询缓存,将不会使用对象缓存?或者我需要避免这样做,因为这样做

我正在寻找有关如何在群集中或使用同一域的多个JVM中最佳配置cayenne的资源。我一直在阅读文档,我看到:

有几种方法可以将对象更改通知其他堆栈。这可以在Modeler中进行设置。但是,每次更改的完全同步通常会导致网络流量和CPU消耗过多,通常会避免这种情况,而本章其他部分介绍的查询缓存方法会更有效

链接到查询结果缓存页面的。我的理解是,当通过getter检索关联对象或通过其id检索对象时,会使用对象缓存。这句话是否告诉我,如果配置查询缓存,将不会使用对象缓存?或者我需要避免这样做,因为这样做会影响应用程序代码中的对象缓存?我是否应该完全禁用对象缓存(如果可能的话)?如果我没有将cayenne设置为通知其他堆栈对象缓存的更改,我是否会面临数据过时的风险

我非常感谢关于跨多个节点运行cayenne的最佳方法的所有提示,或者如果您有一些资源可以向我指出,这也会非常有帮助


提前感谢您的时间

对象缓存和查询缓存彼此独立,但它们可以影响彼此的状态

对象缓存

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

查询缓存

这里演示了使用集群的查询缓存。它使用Cayenne 4.0、EHCache作为缓存提供程序,并使用ActiveMQ/JMS处理跨实例事件

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

下一步是配置缓存,具体方式取决于您使用哪个提供程序指定其默认过期策略(每个缓存组)。例如a

最后,您可以添加集群和事件驱动缓存刷新,这可以通过API调用显式完成,也可以在提交某些实体时隐式完成(仅适用于Cayenne 3.1)

查询缓存刷新非常便宜。通过网络发送的唯一内容是“缓存组”的名称,在接收端,一组列表会立即被惰性地失效。它还可以产生更干净的代码

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

Cayenne版本


我强烈建议至少升级到Cayenne 3.1(甚至升级到4.0.M2)。除此之外,缓存机制比3.0更为成熟。这将使您在配置Cayenne和集成外部缓存提供程序方面的体验变得更加轻松。

这是非常好的信息。非常感谢。我将研究升级。我继承了这个项目,而原作者实际上分叉了3.0.5并做了一些更改,我必须深入研究,看看到底做了哪些更改以及为什么(我相信它很小)。一个小问题:要禁用对象cash,我是将其大小设置为零,还是应该采取其他步骤?我只需让对象缓存单独运行(它仍然很有用,并且将作为查询缓存更新的结果被动更新)。只是不要尝试对其进行集群,并关闭其本地同步设施。我会在一秒钟内用这些信息更新主要回复