Apache Ignite 作为 Hibernate L2 缓存存储重复实体
Apache Ignite as Hibernate L2 cache storing duplicate entities
环境:
- 流浪汉运行MySQL5.6
- Java SE 1.8
- 休眠 4.2.16.Final
- 阿帕奇点燃 1.6
设置:
- 带有 On/Off
字符串 ID 和状态枚举的实体 ToggleSwitch
- equals() 和 hashcode() 都已针对 id
实现
- @Cache 使用 READ_WRITE 和默认区域
- Reader 节点每秒执行 EM.find() 并显示当前状态
- Writer 节点执行 EM.find() 并每 3 秒切换一次状态
- 两个节点都配置了事务原子性、分区缓存模式和FULL_SYNC写同步模式
- 使用 TcpDiscoverySharedFsIpFinder 进行发现
所以我 运行 遇到的问题是 reader 端永远不会从写入端获取更改。我已经使用 IgniteInternalCache.entrySet() 转储了缓存的内容(与状态频率相同),它在缓存中显示了两个具有相同键的 ToggleSwitch 实例。
我已经尝试将它们添加到缓存键中的一个集合中,看看是否会产生相同的结果,但它按预期运行,只存储了一个实例。
我现在不知道发生了什么,有什么想法吗?是错误还是配置错误?
很可能 equals
and/or hashCode
的密钥实现不正确。我会把这两个密钥和它们的内容一起存储在缓存中,然后尝试调用这些方法来检查它们是否一致。
--更新--
当使用默认的二进制编组器时,在多应用程序环境中也会出现此问题。此处有更多详细信息: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>
环境:
- 流浪汉运行MySQL5.6
- Java SE 1.8
- 休眠 4.2.16.Final
- 阿帕奇点燃 1.6
设置:
- 带有 On/Off 字符串 ID 和状态枚举的实体 ToggleSwitch
- equals() 和 hashcode() 都已针对 id 实现
- @Cache 使用 READ_WRITE 和默认区域
- Reader 节点每秒执行 EM.find() 并显示当前状态
- Writer 节点执行 EM.find() 并每 3 秒切换一次状态
- 两个节点都配置了事务原子性、分区缓存模式和FULL_SYNC写同步模式
- 使用 TcpDiscoverySharedFsIpFinder 进行发现
所以我 运行 遇到的问题是 reader 端永远不会从写入端获取更改。我已经使用 IgniteInternalCache.entrySet() 转储了缓存的内容(与状态频率相同),它在缓存中显示了两个具有相同键的 ToggleSwitch 实例。
我已经尝试将它们添加到缓存键中的一个集合中,看看是否会产生相同的结果,但它按预期运行,只存储了一个实例。
我现在不知道发生了什么,有什么想法吗?是错误还是配置错误?
很可能 equals
and/or hashCode
的密钥实现不正确。我会把这两个密钥和它们的内容一起存储在缓存中,然后尝试调用这些方法来检查它们是否一致。
--更新--
当使用默认的二进制编组器时,在多应用程序环境中也会出现此问题。此处有更多详细信息: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>