2008-11-06 8 views
0

Я ищу хороший способ запуска сервера Apache Derby в сетевом режиме. Я использую NetworkServerControl для запуска сервера, и он отлично работает.Kill Derby DB Network Server на фоне

Я начинаю сервер, как это:

/** 
* 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; 
    } 
} 

На главной() Я это так что процесс не умирает, а сервер работает

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

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

ответ

0

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

1

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

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

Редактировать: О, это был не SQL, он подключается к БД с параметром «shutdown = true». См here:

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

Это не работает с NetworkServerControl. – ferro 2008-11-06 18:54:40

0

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

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

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

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

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

+0

Йе, я тоже подумал об этом, но в то время, когда мы думали, что это будет излишним, и возникнут проблемы с безопасностью. Благодаря! – ferro 2008-11-06 18:57:55