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 の新しいインスタンスが呼び出されたときに、古いインスタンスがまだ実行されていることです (本当に幸運で、新しいサーバーが起動する前にテストが行​​われない限り)。

サーバーが既に実行されているかどうかをテストしてから再起動しないことはわかっていますが、サーバーが既に存在する場合は、再起動のように動作するようにしたいと考えています。

4

3 に答える 3

2

少し前に derby でプロジェクトを行いました (ネットワーク モードでの実行を含む)。サーバー上で実行できる SQL が derby をシャットダウンすることを覚えているようです。

その場合は (申し訳ありませんが、Google で検索する時間がありません)、起動時にネットワーク インスタンスを探すことができます。存在する場合は、この SQL を実行します。最終的にシャットダウンされたと判断したら(存在することをポーリングすると思います)、再度起動できます。

編集:ああ、それはSQLではありませんでした。パラメータとして「shutdown = true」を使用してDBに接続しています。ここを参照してください:

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

サーバーを強制終了するときに作成されるファイルを使用することになり、サーバープロセスでファイルが存在するかどうかを定期的にチェックし、存在する場合はサーバーを強制終了します。

于 2009-04-07T17:38:31.417 に答える
1

私が挙げたもう 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 に答える