gpt4 book ai didi

java - Apache Ignite 作为 Hibernate L2 缓存存储重复实体

转载 作者:行者123 更新时间:2023-12-05 07:48:49 26 4
gpt4 key购买 nike

环境:

  • Vagrant 运行 MySQL 5.6
  • Java SE 1.8
  • hibernate 4.2.16.Final
  • Apache 点燃 1.6

设置:

  • 实体 ToggleSwitch,带有 String id 和 State enum of On/Off
  • equals() 和 hashcode() 都已经针对 id 实现了
  • @Cache 使用 READ_WRITE 和默认区域
  • Reader 节点每秒执行 EM.find() 并显示当前状态
  • Writer 节点执行 EM.find() 并每 3 秒切换一次状态
  • 两个节点都配置了 TRANSACTIONAL 原子性、PARTITIONED 缓存模式和 FULL_SYNC 写同步模式
  • 使用 TcpDiscoverySharedFsIpFinder 进行发现

所以我遇到的问题是读者端永远不会从写作端获取更改。我已经使用 IgniteInternalCache.entrySet() 转储了缓存的内容(与状态频率相同),它在缓存中显示了两个具有相同键的 ToggleSwitch 实例。

我已经尝试将它们从缓存的键中添加到一个集合中,看看是否会产生相同的结果,但它按预期运行,只存储了一个实例。

我现在不知道发生了什么,有什么想法吗?是错误还是配置错误?

最佳答案

很可能 equals 和/或 hashCode 未正确实现 key 。我会将这两个键与其内容一起存储在缓存中,并尝试调用这些方法来检查它们是否一致。

-- 更新--

当使用默认的二进制编码器时,这个问题也可能发生在多应用程序环境中。更多详情:https://issues.apache.org/jira/browse/IGNITE-3429

作为解决方法,您可以从默认的二进制序列化切换到 OptimizedMarhsaller(请参阅下面的配置示例)。这将强制关键对象在服务器端反序列化并正确应用自定义 equals 逻辑。

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="marshaller">
<bean class="org.apache.ignite.marshaller.optimized.OptimizedMarshaller"/>
</property>
</bean>

关于java - Apache Ignite 作为 Hibernate L2 缓存存储重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38132263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com