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



环境:

  • Vagrant运行MySQL 5.6
  • Java SE 1.8
  • 休眠4.2.16.期末
  • Apache Ignite 1.6

设置:

  • 字符串id和状态枚举为开/关的实体切换开关
  • equals((和hashcode((都已针对id实现
  • @使用READ_WRITE和默认区域缓存
  • 读卡器节点执行EM.find((并每秒显示当前状态
  • Writer节点执行EM.find((并每3秒切换一次State
  • 配置了TRANSACTIONAL原子性、PARTITIONED缓存模式和FULL_SYNC写入同步模式的两个节点
  • 使用TcpDiscoverySharedFsIpFinder进行发现

因此,我遇到的问题是,读者方面从来没有从写作方面了解到变化。我已经使用IgniteInternalCache.entrySet((转储了缓存的内容(与状态的频率相同(,它显示了缓存中具有相同键的两个ToggleSwitch实例。

我曾尝试将它们从缓存的键添加到Set中,看看这是否会产生相同的结果,但它只存储了一个实例,效果如预期。

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

键的equals和/或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>

最新更新