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

标签 java hibernate ignite

环境:

  • 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/

相关文章:

Hibernate 动态更新= false

c# - Ignite集群在Kubernetes内运行,但应用程序在其外部

java - Eclipse 中的按钮按下事件 (Android)

java - 为什么 Spring Data 存储库方法参数名称在 Java 8 上也不可用?

java - 使用 Morphia (Java) 连接到 MongoDB

java - 如何在 hibernate 中使用复合 PK 为 JOINED 继承设置注释?

java - 在netbeans中使用javamail报错

java - 具有嵌入式对象的实体的 Hibernate 标准

spring - 由 : java. lang.ClassNotFoundException : org. apache.ignite.internal.util.spring.IgniteSpringHelperImpl 引起

java - 将新主机添加到 apache ignite 数据网格