在背景上杀死Derby DB网络服务器

时间:2008-11-06 18:17:12

标签: java derby javadb

我正在寻找一种在网络模式下运行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的新实例被调用时,旧的JAR仍将运行(除非我真的很幸运并且在新服务器启动之前进行了测试)。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

启动你的德比JAR实例将是:

  • 查看是否已同意TCP端口已打开。
  • 如果是,请发送shutdown命令。
    • 您发送命令的JAR将使用stop()方法关闭德比。
    • 关闭德比后,它会向success发回任何内容并关闭连接。
  • 我们听取商定的TCP端口。
  • 我们致电start()并启动Derby。

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

答案 2 :(得分:0)

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