Играть! неправильно выключается H2 - PullRequest
7 голосов
/ 25 августа 2011

Я использую Play, чтобы написать веб-приложение, которое развернуто в Tomcat. Поскольку приложение не будет обрабатывать слишком много данных, я использую базу данных H2 по умолчанию с Hibernate. Когда я хочу развернуть новую версию приложения, я закрываю tomcat, стираю старое веб-приложение и WAR, добавляю мою новую WAR и снова запускаю.

Это работало до нескольких дней назад, когда я добавил компонент базы данных. Теперь я часто не могу повторно развернуть приложение. Когда я удаляю старый каталог, он автоматически восстанавливается с такой структурой:

$ ls -laR myapp/
myapp/:
total 24
drwxr-xr-x  3 root root 4096 Aug 24 17:20 .
drwxr-xr-x 13 root root 4096 Aug 24 17:20 ..
drwxr-xr-x  3 root root 4096 Aug 24 17:20 WEB-INF

myapp/WEB-INF:
total 24
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .
drwxr-xr-x 3 root root 4096 Aug 24 17:20 ..
drwxr-xr-x 3 root root 4096 Aug 24 17:20 application

myapp/WEB-INF/application:
total 24
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .
drwxr-xr-x 3 root root 4096 Aug 24 17:20 ..
drwxr-xr-x 3 root root 4096 Aug 24 17:20 db

myapp/WEB-INF/application/db:
total 24
drwxr-xr-x 3 root root 4096 Aug 24 17:20 .
drwxr-xr-x 3 root root 4096 Aug 24 17:20 ..
drwxr-xr-x 2 root root 4096 Aug 24 17:20 h2

myapp/WEB-INF/application/db/h2:
total 24
drwxr-xr-x 2 root root 4096 Aug 24 17:20 .
drwxr-xr-x 3 root root 4096 Aug 24 17:20 ..
-rw-r--r-- 1 root root  100 Aug 24 17:20 play.lock.db

То же самое происходит, когда разархивируется WAR.

Недавно я заметил сообщение в журнале catalina.out, в котором говорится, что мое приложение не закрывает процесс, называемый «H2 File Lock Watchdog». Основываясь на кратком поиске документов H2, я думаю, что этот процесс мешает моему приложению.

EDIT

Вот строка жалобы в файле журнала:

SEVERE: The web application [/myapp] appears to have started a thread named [H2 File Lock Watchdog /var/lib/apache-tomcat-6.0.32/webapps/myapp/WEB-INF/application/db/h2/play.lock.db] but has failed to stop it. This is very likely to create a memory leak.

Итак, как мне убить этот процесс? Я не могу перезапустить машину, потому что она не моя, и я не могу найти сторожевой таймер с top или ps. Я бы предпочел, чтобы Play автоматически выключал его, но я не собираюсь встраивать его в свой сценарий развертывания.

Спасибо за миллион, если вы прочитали это далеко!

1 Ответ

9 голосов
/ 25 августа 2011

Я закрыл кота

Вы уверены, что полностью отключили tomcat? Потому что база данных H2 все еще работает. Если вы выключите процесс Tomcat, база данных также будет остановлена ​​(поскольку H2 работает внутри процесса Tomcat). За исключением случаев, когда вы запускаете базу данных в другом процессе.

Или вы только что закрыли веб-приложение в tomcat? Если это так, то хотя бы одно соединение с базой данных не было закрыто, поэтому база данных продолжает работать (и создает этот файл .lock.db).

Теперь я не знаю игровую среду и не могу сказать, как обеспечить закрытие всех соединений с базой данных.

Один из способов принудительного закрытия базы данных - выполнить инструкцию SQL SHUTDOWN.

Я не могу найти сторожевой таймер с топом или пс

top и ps только отображение процессов . Сторожевой таймер H2 - это поток в рамках процесса Java. Чтобы увидеть тему, используйте:

jps -l (to get the list of Java processes)
jstack -l <pid> (to get a full thread dump)
...