【发布时间】:2014-06-02 05:49:45
【问题描述】:
在我的项目中,我有 2 台服务器运行一个应用程序。他们运行两个初始化为 Spring bean 的 Hazelcast 节点。我使用 Hibernate,Hazelcast 也支持它的二级缓存。有一个分布式地图,它由一个地图加载器支持,该加载器在一开始就准备好缓存。如果重启了 2 台服务器中的一台(节点 B),会出现以下情况:
- 节点 A 发现节点 B 已消失并定期尝试重新连接
- 节点 B 开始初始化 Spring 上下文,在此期间 Hazelcast 实例也启动
- 节点 A 加入节点 B 并且一些迁移 (?) 操作命中节点 B,它试图获取上述地图
- Spring 并行初始化 JPA 实体管理器,该管理器也尝试访问映射(用于设置 L2 缓存)
- 这会导致死锁:Spring init 线程持有与 bean map 相关的锁并尝试获取分布式映射,而迁移操作持有映射并尝试从 Spring 获取 maploader bean
我的问题是我无法控制 Hazelcast 何时首次接受来自其对等方的连接。
我的 HZ bean 是这样定义的:
@Bean
public void hazelcast() {
Hazelcast.newInstance(config());
}
在 Spring 完全启动之前,我迫不及待地接受连接。在我的应用程序完全启动之前,我找不到任何方法来阻止 Hazelcast 执行操作。
如何以编程方式启动 Hazelcast TCP/IP 网络接口?或者我怎样才能拒绝连接?您能否建议一种无死锁模式来实现 JPA 的 L2 缓存,在启动时使用也使用 JPA 加载特定分布式地图的 maploader bean 执行缓存素数?
【问题讨论】:
标签: java hibernate caching jpa hazelcast