【发布时间】: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