当前位置: 首页 > 面试题库 >

如何为多个jvm支持创建单例Java类?

淳于坚壁
2023-03-14
问题内容

例如,我有DBManager.java Singleton类,必须将其部署在集群环境中。这是一个基于Web的应用程序,具有以下部署策略

Apache负载平衡器-> Tomcat 6(群集中有3个服务器)。

我必须为3个tomcat实例维护一个DBManager实例。

我的代码是

package com.db.util;
public class DBManager {
    private static DBManager singleInstance;
    private DBManager () {}
    public static DBManager getSingleInstance() {
        if (singleInstance == null) {
            synchronized (DBManager.class) {
                if (singleInstance == null) {
                    singleInstance = new DBManager ();
                }
            }
        }
        return singleInstance;
    }
}

我一直在寻找解决此问题的方法,并发现类似JGroups API的东西。可以使用JGroups实现吗?任何想法,如何实施?


问题答案:

Java在每个实例中为您提供一个单例,您需要在实例之间进行某种协调,因此在任何给定时间它们都是活动的,但是如果活动的实例死亡,则另一个实例将变为活动的。

一些应用程序服务器具有内置功能来控制此类协调的工作程序实例,我不知道Tomcat是否具有此类功能。

但是,根据您的情况,您有一个数据库,这给了您一个协调点。我尚未对此进行详细设计,但我认为可以使用控制表中的专用行创建保留方案。高效地执行此操作将有点棘手,要在检测实例死亡的速度与轮询数据库以查看哪个实例处于活动状态的开销之间取得平衡,但这似乎是可行的。

想法是该记录包含“ reservedUntil”时间戳和“
processId”。每个进程都读取记录,如果它包含它自己的ID并且时间戳尚未过期,则它知道它可以工作。当时间快要到期时,活动进程将使用乐观锁定样式“
Update where timestamp == old
timestamp”来更新时间戳,以管理竞争条件。每个非活动进程都将等待,直到其上次读取的时间戳记到期为止,然后尝试通过再次使用乐观锁定Update
where来更新记录来尝试控制。通常,试图控制的尝试将失败,但是如果成功,我们现在将拥有一个新的活动实例,并且由于乐观锁定,我们只能获得一个活动实例。




 类似资料:
  • 问题内容: 我正在使用MVC创建一个基本的计算器。到目前为止,我正在改编一个教程,该教程仅将两个用户输入的值加在一起。 目前,我要添加到视图中的每个按钮都有其自己的侦听器,可以。但是,根据教程的控制器每个按钮只有一个ActionListener内部类。这重复了大量代码。 如何为所有按下的按钮创建一个ActionListener类,并在按下的按钮的ID上使用case语句? 在视图中注册oneButt

  • 我不知道这里发生了什么事。我有一个包含列表的单例bean。当我向列表中添加项目时,内容总是一致的。然而,当我从另一个服务调用该列表上的get时,它返回一个具有不同java id的空列表。 下面是类的定义方式: 两者的区别是: add方法是从侦听新消息并调用相应处理程序的bean调用的。get是从另一个bean调用的,该bean在事件发生后处理数据。当我一个接一个地调用这两个对象时,列表具有不同的I

  • 当交互中有多个头时,pact-jvm-provider-maven2.12版本3.5.25会在运行以验证提供者端的契约时引发异常 我的互动是 如果我从请求头中删除“content-type”:“application/json”,这个错误就会消失。这是插件中的一个bug吗?

  • 问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri

  • 我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录

  • 我在Mac os x maverick上运行Android Studio。我已经安装了64位JDK。当我运行模拟器时,我得到了信息 错误:异常生成进程终止: 错误:此Java实例不支持32位JVM 请安装所需的版本。 在Android Studio。 返回 和 点到 所以一切似乎都很好。可能出了什么问题? 我仍然有一个旧的jdk1。6躺在我的mac电脑上。当删除它时,Android Studio要