环境:
- 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/