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

时间:2016-06-30 20:02:06

标签: java hibernate ignite

环境:

  • Vagrant运行MySQL 5.6
  • Java SE 1.8
  • Hibernate 4.2.16.Final
  • Apache Ignite 1.6

设定:

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

所以我遇到的问题是读者方从不接受写作方面的改变。我使用IgniteInternalCache.entrySet()转储了缓存的内容(与状态相同的频率),它在缓存中显示了两个具有相同键的ToggleSwitch实例。

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

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

1 个答案:

答案 0 :(得分:0)

最有可能{8}}和/或equals未正确实施密钥。我会将存储在缓存中的这两个密钥与其内容一起使用,并尝试调用这些方法来检查它们是否一致。

- 更新 -

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

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

equals