0

我正在寻找一种在网络模式下运行 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 像重新启动一样工作。

4

3 回答 3

2

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

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

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

DriverManager.getConnection(
    "jdbc:derby:sample;shutdown=true");
于 2008-11-06T18:28:33.823 回答
1

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

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

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

  • 查看是否同意的 TCP 端口已打开。
  • 如果是这样,请发送关闭命令。
    • stop()然后,您将命令发送到的 JAR 将使用该方法关闭 derby 。
    • 完成关闭 derby 后,它将发送success回任何内容并关闭连接。
  • 我们监听约定的 TCP 端口。
  • 我们打电话start()并开始德比。

这比我的其他解决方案工作更多,但理论上是一个更好的解决方案,因为作为重新启动的一部分,您的 JAR 可能还想做其他事情(清理/重新启动其他资源,记录它正在关闭的事实,诸如此类) .

于 2008-11-06T18:39:20.087 回答
1

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

于 2009-04-07T17:38:31.417 回答