Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM故障转移问题_Java_Jvm - Fatal编程技术网

Java JVM故障转移问题

Java JVM故障转移问题,java,jvm,Java,Jvm,我对这个代码有问题。我有两台同时运行JVM的服务器,serverA和serverB。除了名称之外,所有的过程、软件都是相同的。其思想是,如果serverA上的JVM出现故障,serverB上的JVM将立即接管 为了检查哪个服务器是主服务器,我运行了一个检查方法来更新数据库中的表(服务器名称和更新日期) 例如,当serverA是main时,它将检查数据库中的当前服务器是否是serverA。如果是这样,它将更新服务器名称和数据库上的上次更新时间。如果不是(main=ServerB),它将检查当前时间

我对这个代码有问题。我有两台同时运行JVM的服务器,serverA和serverB。除了名称之外,所有的过程、软件都是相同的。其思想是,如果serverA上的JVM出现故障,serverB上的JVM将立即接管

为了检查哪个服务器是主服务器,我运行了一个检查方法来更新数据库中的表(服务器名称和更新日期)

例如,当serverA是main时,它将检查数据库中的当前服务器是否是serverA。如果是这样,它将更新服务器名称和数据库上的上次更新时间。如果不是(main=ServerB),它将检查当前时间和上次更新时间之间的差异。如果结果大于50秒(表明当前主服务器存在问题),serverA将自身更新为主服务器

我面临的问题是,在某些情况下,两台服务器都将自身更新为主服务器。例如:

ServerA在6:20:23左右更新

ServerB在6:20:59左右更新

由于这两个JVM试图同时运行JVM进程,所以我有两个JVM在同一个作业上创建锁的实例。通常,当这些问题发生时,非主服务器的JVM将挂起,并最终出现内存不足错误

我想知道是否有任何方法可以在另一台服务器接管时停止一台服务器(重启JVM?),或者防止这两台服务器争夺主位置

非常感谢您的帮助


if (WmsParam.HOST_SERVER_NAME.equals(r.getLastUpdatePname())) //check if current server is still main
    {
        result = true;
    }
else
    {
        Calendar nowTime = Calendar.getInstance();
        long lastUsed = r.getLastUpdateDate().getTime();
        long nowTimeMili = nowTime.getTimeInMillis();

        long diff = nowTimeMili - lastUsed;

        long diffSec = diff /1000;

        if (diffSec >= WmsParam.HOST_DELAY_SECONDS) //host_delay_seconds = 50
        {
            result = true;
        }
    }

if (result)
        {

            rsAkey.setKey(rsKey);
            rsAkey.updateLastUsedDate(new Date());
            rsAkey.updateLastUpdatePname(WmsParam.HOST_SERVER_NAME);

            reasonHandler.modify(rsAkey);
            getConnection().commit();

        }


这是一个难题。你为什么不使用为此而建立的数据库?我不太确定你的问题。JVM正在为操作运行多个进程,数据库表将告诉我们哪个进程是主进程。