Hazelcast Spring(boot)JPA-保存新实体

Hazelcast Spring(boot)JPA-保存新实体,hazelcast,Hazelcast,我有一个使用JPA的现有客户机/服务器Spring boot项目。我按照示例创建了一个Hazelcast客户机和服务器。填充Hazelcast地图的数据库中存在现有数据。每个db条目都有一个整数id,该id将成为映射键。在服务器上的loadAllKeys()期间,我填充了一个由Hazelcast分发/管理的集合;在MemCenter UI中,我看到填充的映射&包含预期整数键数的集合 根据上面提到的示例,客户机应用程序有一个服务,它使用HazelcastRepository保存()新实体。因为新实

我有一个使用JPA的现有客户机/服务器Spring boot项目。我按照示例创建了一个Hazelcast客户机和服务器。填充Hazelcast地图的数据库中存在现有数据。每个db条目都有一个整数id,该id将成为映射键。在服务器上的loadAllKeys()期间,我填充了一个由Hazelcast分发/管理的集合;在MemCenter UI中,我看到填充的映射&包含预期整数键数的集合

根据上面提到的示例,客户机应用程序有一个服务,它使用HazelcastRepository保存()新实体。因为新实体没有id,所以在客户端(创建新实体的地方),我有一个返回nextKey()的IdGenerator。询问(分布式)集合是否包含所述id/密钥以防止密钥冲突

然后,一旦客户端上的save()到达服务器,我会尝试将新密钥添加到集合中,以避免将来发生任何冲突。这样做,我得到了以下例外:

线程[hz.\uhzinstance\u1\u dev.partition operation.Thread-3,5,\uhzinstance\u1\u dev]无法进行远程调用:com.hazelcast.collection.impl.collection.operations.CollectionAddOperation{serviceName='hz:impl:setService',identityHash=1523576050,partitionId=64,replicaidex=0,callId=0,invocationTime=-1(1969-12-31 15:59:999),waitTimeout=-1,callTimeout=60000,name=com.intelligrated.hazelcast.server.maploader.ScannersMapStore\u Set}

出于某种原因,我还没有找到一个关于如何处理新数据创建的示例,尤其是当数据已经存在时。示例/测试非常简单,当保存新对象时,id是硬编码的(通常为“1”)

我设计了以上的解决方案,希望我能使这项工作。如果有更好的方法,请给我举一个有用的例子。

所以,我觉得很有用

基本上,在直写的MapStore b/c中不能有“操作”:

因为writethrough映射存储操作在分区线程上运行,并且使用另一个基于分区的操作(如Containskey)可能会导致死锁。这就是为什么我们在那里有一个检查和一个异常


因此,从我的MapStore中删除了所有的Set业务,并向一个单独的“Listener”类添加了必要的逻辑。map store针对所述侦听器订阅的主题发送“设置更新事件”。

使用Hazelcast复制JPA数据听起来像是一种(可能过早的)优化。在大多数情况下,数据库速度足够快,即使没有任何辅助JPA缓存。如果我必须使用分布式共享缓存,在查看HZ之前,我会先查看JPA提供商直接支持的缓存协调支持。有什么帮助吗?不幸的是,文档没有解释如何处理密钥。同样,MapLoader(实现)不能执行“任何工作”