我有一个应用程序,它将一组复杂的规则与事务进行比较。因为规则不经常更改并且有很多事务,所以我将数据库中的规则作为singelton(RuleInfo)获取。更改规则后,我调用updateRuleInfo。
public static void updateRuleInfo(){
instance = new RuleInfo();
这在我的开发和测试环境中运行良好,因为它们都在单个服务器上,但是,我们的生产环境是WebSphere集群环境(2个服务器,每个服务器有2个节点)。因此,如果更新了个人或工具的规则,则更改会显示在一个节点上,但用户可能会尝试在另一个节点上进行事务并获取旧的规则集。每次有人登录应用程序时我都尝试调用updateRuleInfo,但这并不是一直都有效。
有没有办法在所有节点上更新单例?
答案 0 :(得分:3)
据我所知,你正在使用你的单身人士作为数据缓存。因此,当原始数据发生变化时,您必须告诉所有单身人士使他们的数据无效,以便他们在下次访问时自行重新加载。
实现此目的的一种方法是使用JMS发布/订阅者模式。部署JMS主题;所有单件服务都订阅该主题,并在数据源发生变化时得到通知。
请参阅http://www.javaspecialists.eu/archive/Issue052.html(“分布式单例缓存”一章)。
答案 1 :(得分:0)
群集环境中的单身人士很棘手
检查此解决方案:
Hazelcast with a distributed lock
Memcache(如果数据量适合内存)
最好是在每个节点上运行单例并从唯一的后端获取数据
此致