我使用Spring-Boot,Spring-Data / JPA和Hazelcast客户端/服务器拓扑。在我的测试应用程序的一部分中,我正在计算在客户端执行CRUD操作的时间(服务器是与关系数据库交互的服务器)。我通过将write-delay-seconds设置为10来将映射(存储)配置为后写。
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。
答案 0 :(得分:0)
不幸的是,这是如何工作的,请参阅https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html#save-S-。
外部商店可能会以某种方式改变保存的条目。
虽然您知道它不会这样做,但是在定义的保存中没有变体。
所以答案似乎是目前通用的Spring存储库定义中没有这个。为什么不提出Spring Data团队的功能请求?