【问题标题】:hazelcast spring-data write-throughhazelcast spring-data 直写
【发布时间】:2017-05-20 19:53:58
【问题描述】:

我正在使用带有 Hazelcast 客户端/服务器拓扑的 Spring-Boot、Spring-Data/JPA。在我的部分测试应用程序中,我正在计算在客户端执行 CRUD 操作的时间(服务器是与关系数据库交互的那个)。我通过将 write-delay-seconds 设置为 10 将 map(Store) 配置为后写。

Spring-Data 的 save() 返回持久化的实体。因此,在客户端应用程序中,应用程序流将被阻塞,直到(服务器)返回持久化实体。

想知道是否有替代方案,在这种情况下,客户端不必等待实体持续存在。给人的印象是,一旦新数据存储在 Map 中,持久化到支持的数据就会异步发生 -> 客户端应用程序不必等待。

hazelast.xml 中的地图配置:

<map name="com.foo.MyMap">
    <map-store enabled="true" initial-mode="EAGER">
        <class-name>com.foo.MyMapStore</class-name>
        <write-delay-seconds>10</write-delay-seconds>
    </map-store>
</map>

@NeilStevenson 我不觉得你的回复特别有帮助。我在earlier post 上询问了在哪里以及如何生成 Map 键。您向我指出了未能阐明该主题的文档。 hazelcast(和其他)示例也是如此。

将缓存放在第一位的目的是避免访问数据库。当我们添加数据时(通过 save()),我们还需要为 Map 生成一个唯一键。该键也成为数据库表中的 Entity.Id。由于再次生成这些 Id 的是 hazelcast 客户端,因此无需等待记录持久保存在后端。

等待 save() 返回持久对象的唯一原因是捕获任何不是因为 ID 的异常。

【问题讨论】:

  • save() 方法正在返回持久化条目,因为它可能(通常)已被持久性系统修改——例如在 RDBMS 上自动生成的 @Id 列
  • 根据这个docs.hazelcast.org/docs/3.4/manual/html/map-persistence.html map.put 操作应该在配置后写时返回而不等待异步存储。这就是应该使用的。这听起来像是一个错误,或者您配置的东西与我想象的完全不同。请确认您已按照上面链接中的说明配置了后写。另外,您可以尝试仅使用 Hazelcast(没有弹簧数据)的行为吗?

标签: spring-data hazelcast


【解决方案1】:

不幸的是,这就是它的工作原理,请参阅https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#save-S-

外部存储可能会以某种方式改变保存的条目。

虽然你知道它不会这样做,但没有定义保存的变体。

所以答案似乎是通用 Spring 存储库定义中目前不可用。为什么不向 Spring Data 团队提出功能请求?

【讨论】:

  • 谢谢。我认为下一次迭代将使用“纯”Hazelcast,其中服务直接与地图交互。剩下的一点是“事务性”。我在旧文档 (3.5) 中看到了这一点,但在当前的 3.8.x 中没有看到 - 需要能够回滚等。对我在另一篇文章中提出的密钥生成问题有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多