群集环境中的单例

将 Singleton 对象重构到群集环境的最佳策略是什么?

我们使用 Singleton 从数据库中缓存一些自定义信息。它大部分是只读的,但在发生某些特定事件时会刷新。

现在,我们的应用程序需要部署在群集环境中。根据定义,每个 JVM 都有自己的单例实例。因此,当单个节点上发生刷新事件并且其缓存被刷新时,JVM 之间的高速缓存可能不同步。

保持缓存同步的最佳方法是什么?

谢谢。

编辑:缓存主要用于向UI提供自动完成列表(性能原因),我们使用Websphere。因此,欢迎任何与Websphere相关的提示。


答案 1

将单一实例缓存替换为分布式缓存。

一个这样的缓存可能是JBoss Infinispan,但我确信存在其他分布式缓存和网格技术,包括目前可能更成熟的商业技术。

对于一般的单例对象,我不确定。我想我一开始就尽量不拥有单例。


答案 2

最简单的方法是:

  1. 将过期计时器添加到单例缓存中,以便每隔一段时间就会清除缓存,并且子序列调用会从源(例如数据库)获取更新的数据

  2. 使用类似 JMS topic/tibRV 的东西为缓存实现通知机制。获取每个缓存实例以订阅并响应有关此主题广播的任何更改消息。


推荐