【问题标题】:Kill Derby DB Network Server on background在后台终止 Derby DB 网络服务器
【发布时间】:2008-11-06 18:17:12
【问题描述】:

我正在寻找一种在网络模式下运行 Apache Derby 服务器的好方法。我正在使用 NetworkServerControl 启动服务器,它运行良好。

我这样启动服务器:

/**
 * starts the network server
 * @return true if sucessfull
 */
public boolean start()
{
    try
    {
        // just to be sure that we don't start two servers
        this.stop();

        server = new NetworkServerControl();
        server.start( null );

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

然后像这样停止它:

/**
 * stops the server
 * 
 * @return true if there were no problems stopping the server
 */
public boolean stop()
{
    try
    {
        if ( server == null )
        {
            server = new NetworkServerControl();
        }
        server.shutdown();

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

在 main() 我有这个,所以在服务器运行时进程不会死

(...)
clsDB.start();

while( clsDB.testForConnection() )
{
   Thread.sleep( 60000 );
}

testForConnection() 看起来像这样:

/**
 * Try to test for a connection
 * 
 * @return true if the server is alive
 */
public boolean testForConnection()
{
    try
    {
        server.ping();

        return true;
    }
    catch ( Exception ex )
    {
        this.logLogger.debug( ex );
        return false;
    }
}

我的问题是,当我的 JAR 的新实例被调用时,旧的实例仍然会运行(除非我真的很幸运并且在新服务器启动之前进行了测试)。

我知道我可以测试服务器是否已经在运行,然后我不会再次启动,但是如果服务器已经在那里,我希望 start 像重新启动一样工作。

【问题讨论】:

    标签: java derby javadb


    【解决方案1】:

    不久前我用 derby 做了一个项目(包括在网络模式下运行),我似乎记得有一些 SQL 可以在关闭 derby 的服务器上执行。

    因此,假设是这种情况(抱歉,没有时间在谷歌上搜索它),您可以在启动时查找您的网络实例。如果存在,则在其上运行此 SQL。一旦你确定它最终被关闭(我想轮询它存在),你就可以再次启动它。

    编辑:哦,这不是 SQL,它使用 'shutdown=true' 作为参数连接到数据库。见here

    DriverManager.getConnection(
        "jdbc:derby:sample;shutdown=true");
    

    【讨论】:

      【解决方案2】:

      我提出的另一个解决方案不与您的 JAR 交互,您可能不喜欢。

      另一种方法是让启动 derby 实例的 JAR 打开一个 TCP 端口,当它启动 derby 时它会监视该端口。然后,您可以从您的新 JAR 实例向该实例发送您自己的关闭命令(显然是在打开您自己的 TCP 端口之前)。

      您的 derby JAR 实例的启动将是:

      • 查看约定的 TCP 端口是否打开。
      • 如果是,请发送关闭命令。
        • 您向其发送命令的 JAR 将使用 stop() 方法关闭 derby。
        • 完成关闭 derby 后,它会发送 success 任何返回并关闭连接。
      • 我们监听约定的 TCP 端口。
      • 我们致电start() 并开始德比。

      这比我的其他解决方案工作量更大,但理论上更好,因为作为重启的一部分,您的 JAR 可能还想做其他事情(清理/重启其他资源,记录它正在关闭的事实,等等像那样)。

      【讨论】:

      • 是的,我也想过这个,但当时我们认为这有点矫枉过正,会出现安全问题。谢谢!
      【解决方案3】:

      我们最终使用了在服务器被终止时创建的文件,然后在服务器进程上我们定期检查该文件是否存在,如果它在那里我们终止服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        相关资源
        最近更新 更多