Убить Derby DB Network Server на фоне - PullRequest
0 голосов
/ 06 ноября 2008

Я ищу хороший способ запустить сервер 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 старое все равно будет работать (если только мне действительно не повезет, и тест будет выполнен до запуска нового сервера).

Я знаю, что мог бы просто проверить, работает ли сервер, и затем я не запустился бы снова, но я бы хотел начать работать как перезапуск, если сервер уже существует.

Ответы [ 3 ]

1 голос
/ 06 ноября 2008

Я недавно выполнил проект с использованием derby (включая запуск в сетевом режиме), и, похоже, я помню, что есть некоторый SQL, который вы можете выполнить на сервере, который отключает derby.

Итак, предположив, что это так (нет времени гуглить по этому поводу, извините), вы можете, при запуске, найти свой сетевой экземпляр. Если он существует, запустите этот SQL на нем. Как только вы определили, что он, наконец, выключен (полагаю, что он существует), вы можете запустить его снова.

Редактировать: О, это не SQL, а соединение с БД с параметром shutdown = true. См здесь :

DriverManager.getConnection(
    "jdbc:derby:sample;shutdown=true");
0 голосов
/ 07 апреля 2009

В итоге мы использовали файл, который создается, когда сервер должен быть убит, а затем в процессе сервера мы периодически проверяем, существует ли файл, если он там, мы убиваем сервер.

0 голосов
/ 06 ноября 2008

Другое решение, которое я поднял, не взаимодействует с вашим JAR, которым вы можете не пользоваться.

Альтернативой является то, что ваш JAR, который запускает экземпляр derby, открывает порт TCP, который он отслеживает при запуске derby. Затем вы можете отправлять свои собственные команды на отключение из нового экземпляра JAR (очевидно, перед открытием собственного TCP-порта).

Запуск экземпляра вашего JAR дерби будет:

  • Проверьте, был ли согласован порт TCP открытым.
  • Если это так, отправьте команду выключения.
    • JAR, на который вы отправляете команду, затем отключает дерби, используя метод stop().
    • После завершения дерби он отправляет success чего угодно и закрывает соединение.
  • Мы прослушиваем согласованный порт TCP.
  • Мы звоним start() и запускаем дерби.

Это больше работы, чем мое другое решение, но теоретически лучше, так как в качестве части вашего перезапуска ваш JAR может захотеть сделать и другие вещи (очистить / перезапустить другие ресурсы, зарегистрировать тот факт, что он выключен вот так).

...