Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite

Posted

技术标签:

【中文标题】Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite【英文标题】:Infinispan equivalent to ehcache's copyOnRead and copyOnWrite 【发布时间】:2011-11-01 07:28:03 【问题描述】:

我计划在现有的 Web 应用程序中实施缓存解决方案。没什么复杂的:基本上是一个支持溢出到磁盘和自动驱逐的并发映射。将来可能需要对缓存进行集群化,但现在不是。

我喜欢 ehcache 的 copyOnRead 和 copyOnWrite 功能,因为这意味着我不必在修改从缓存中取出的内容之前手动克隆内容。现在我已经开始查看Infinispan,但在那里我没有找到任何等效的东西。存在吗?

即,以下单元测试应该通过:

@Test
public void testCopyOnWrite() 
    Date date = new Date(0);
    cache.put(0, date);
    date.setTime(1000);
    date = cache.get(0);
    assertEquals(0, date.getTime());


@Test
public void testCopyOnRead() 
    Date date = new Date(0);
    cache.put(0, date);
    assertNotSame(cache.get(0), cache.get(0));

【问题讨论】:

【参考方案1】:

我相信storeAsBinary只有在对象需要被序列化时才生效,这意味着当调用put操作时,所有者不是当前节点。

这也意味着如果 key 0 的所有者不是当前节点,则问题中的测试用例可以通过,但如果它是单节点环境,它仍然会失败。

【讨论】:

【参考方案2】:

Infinispan 是否支持 copyOnRead/copyOnWrite,尽管实际格式不可插入。配置元素在 Infinispan 4.x 中为 lazyDeserialization,在 Infinispan 5.x 中为 storeAsBinary。对象使用可插入的 Marshaller 框架进行序列化,该框架用于所有形式的编组,包括网络上的 RPC 调用和存储到磁盘。

【讨论】:

【参考方案3】:

据一位 JBoss 开发人员称,Infinispan 尚不支持此类功能。您应该在Infinispan issue tracker 中记录改进请求,以便其他人可以投票(我会)。

话虽如此,如果您现在需要此功能,解决方法是扩展AbstractDelegatingCache,并覆盖getput 方法以添加此功能。您可以使用自己的复制策略,或者看看 EHCache 是如何做到的。

此外,如果您还有其他问题,可以考虑Infinispan forum,因为您将获得来自 Infinispan 社区的更多意见。

【讨论】:

谢谢。我相信正确复制对象图是一个难题(在一般情况下),这就是我不想自己做的原因。我会看看 ehcache 是如何做到的,就像你建议的那样,但我想我最终会在修改之前手动复制我从缓存中取出的内容。 我认为EHCache复制对象的默认策略是使用Java的序列化机制......(序列化对象,然后反序列化它:你得到一个新实例)。当然,它很慢,并且仅在对象可序列化时才有效(但缓存对象通常是这种情况,因为您经常想将它们写在磁盘上......)。不过你说得对,复制对象图是个难题,我以前用过Dozer,你也可以看看:***.com/questions/1432764/… 找到它:svn.terracotta.org/svn/ehcache/trunk/core/src/main/java/net/sf/… 太棒了,在我看来,这几乎剥夺了 ehcache 的优势之一。 此信息已过时,支持很久了。

以上是关于Infinispan 相当于 ehcache 的 copyOnRead 和 copyOnWrite的主要内容,如果未能解决你的问题,请参考以下文章

spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)

Infinispan 初始状态传输超时

Infinispan - 没有删除缓存的选项吗?

Infinispan/hibernate 2 级缓存更新不是事务性的?

infinispan 中的 ISPN000313 错误

防止Infinispan集群化