Изящное завершение режима суперразработчика GWT

Краткое объяснение

Для проекта, в котором я участвую, созданного в GWT 2.7 с использованием Eclipse Luna в качестве IDE, в коде нашего сервера у нас есть пул соединений (база данных mariadb), настроенная с помощью Hikari (http://brettwooldridge.github)..io/HikariCP/). Все работает отлично, кроме одного..

Проблема

Чтобы избежать взрыва нашего сервера базы данных (ubuntu), я реализовал ловушку отключения, например:

public void addShutdownHook() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            dataSource.shutdown();
        }
    });
}

Идеально справляется с очисткой соединений, хранящихся в пуле соединений. Однако при выключении SDM нажатием кнопки «Завершить» в eclipse я заметил, что dataSource.shutdown(); никогда не вызывается, вероятно, потому, что сервер не выключается корректно.

Вышеупомянутое кажется результатом (у меня недостаточно знаний linux (в сочетании с mariadb), чтобы выяснить, правда ли это, но мне это кажется наиболее логичным), чтобы в конечном итоге сделать сервер чрезвычайно медленным и в конечном итоге исчерпать его ресурсы. Итак, я предполагаю, что сервер поддерживает соединения, они складываются n раз, пока ресурсы больше не будут доступны, и сервер не взорвется.

Вопрос

Как правильно очистить эти ресурсы с помощью SDM? Или мне не следует использовать пул соединений во время разработки, а использовать его только в среде принятия/производства?

Спасибо за ваше времяb


person Joey Roosing    schedule 17.02.2015    source источник
comment
Во время разработки с Eclipse вы также можете попробовать запустить с minimumIdle=0 и idleTime=30000 (30 секунд), поэтому, как правило, в пуле не будет много (или вообще) подключений – в основном это будут создается по требованию.   -  person brettw    schedule 21.02.2015


Ответы (1)


Несколько вещей:

  • вы должны использовать жизненный цикл веб-приложения, а не жизненный цикл JVM. Используйте ServletContextListener, а не хук выключения.

  • это проблема Eclipse, она всегда принудительно завершает процессы, минуя перехватчики выключения. После того, как вы используете прослушиватель контекста сервлета, попробуйте перезагрузить веб-приложение перед завершением процесса.

Тем не менее, мне было бы странно, если бы это была ваша проблема: уничтожение процесса должно закрыть все соединения, высвободив ресурсы на сервере (в противном случае, если вы спросите меня, это будет ошибка сервера)

person Thomas Broyer    schedule 17.02.2015
comment
Спасибо за лидерство. Я скоро займусь этим! Подключение к жизненному циклу веб-приложения имеет гораздо больше смысла, чем к жизненному циклу jvm. Что касается последнего бита, я не могу проверить, действительно ли он закрывает ресурсы, мне придется потратить некоторое время на игру с сервером. - person Joey Roosing; 18.02.2015
comment
Эй, просто возвращаюсь к вам и сообщаю результат. Вы дали мне несколько хороших советов, которые в конечном итоге привели к более чистому решению, чем то, что у меня было. Спасибо за это! Хотя затмение по-прежнему будет проблемой, использование некоторых трюков, как вы описали, помогает. - person Joey Roosing; 19.02.2015