2011-08-24 14 views
6

Używam Play, aby napisać aplikację webową wdrożoną w Tomcat. Ponieważ aplikacja nie przetwarza bardzo dużo danych, używam domyślnej bazy danych H2 z Hibernate. Kiedy chcę wdrożyć nową wersję aplikacji, wyłączam program tomcat, usuwam starą aplikację webową i WAR, dodam moją nową WAR i uruchomię kopię zapasową.Graj! nie wyłączanie H2 poprawnie

To działało do kilku dni temu, kiedy dodałem komponent bazy danych. Teraz często nie mogę ponownie wdrożyć aplikacji. Kiedy usunąć stary katalog, jest on automatycznie regenerowane z tej struktury:

$ 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 

To samo dzieje się, gdy wojna rozpina.

Niedawno zauważyłem komunikat o błędzie w dzienniku catalina.out, który narzekał na moją aplikację, nie zamykając procesu o nazwie "Plik blokujący pliku blokady H2". Na podstawie krótkiego przeszukania dokumentów H2 wydaje mi się, że ten proces zakłóca moją aplikację.

EDIT

Oto linia narzekania w pliku dziennika:

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.

Więc jak mogę zabić ten proces? Nie mogę ponownie uruchomić maszyny, ponieważ nie jest ona moja i nie mogę znaleźć stacji monitorującej pod numerem top lub ps. Wolałbym, żeby Play automatycznie wyłączył tę funkcję, ale nie jestem ponad jej wbudowaniem w mój skrypt wdrażania.

Dzięki za milion, jeśli przeczytałeś tak daleko!

+0

Kolejnym punktem wartym wspomnienia jest to, że proces bazy danych ewidentnie ginie. Nie jestem pewien, ile czasu to zajmie, ale jest w skali godzin.Czekanie na to jest tylko rodzajem rozwiązania, ale lepsze niż nic? – andronikus

Odpowiedz

8

ja zamknąć Tomcat

Czy jesteś pewien, że całkowicie wyłączyć tomcat? Ponieważ baza danych H2 działa prędzej. Jeśli zamkniesz proces tomcat, baza danych również zostanie zatrzymana (ponieważ H2 działa w procesie tomcat). Z wyjątkiem przypadku uruchomienia bazy danych w innym procesie.

A może właśnie zamknąłeś aplikację internetową w ramach tomcat? W takim przypadku przynajmniej jedno połączenie z bazą danych nie zostało zamknięte, więc baza danych nadal działa (i tworzy ten plik .lock.db).

Teraz nie znam struktury gry i nie mogę powiedzieć, jak zapewnić, że wszystkie połączenia z bazami danych są zamknięte.

Jednym ze sposobów wymuszenia zamknięcia bazy danych jest uruchomienie instrukcji SQL SHUTDOWN.

nie mogę znaleźć watchdog z góry lub ps

top i ps wyświetlać tylko procesy. P2 watchdog jest wątek w ramach procesu java. Aby wyświetlić wątek, należy użyć:

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

Zamykam serwer z 'sh bin/shutdown.sh' jak zwykle. Czy jest coś jeszcze, co powinienem robić? Sztuka teatralna! framework radzi sobie z takimi rzeczami automatycznie, więc nie wiem, jak przekazać instrukcję "SHUTDOWN". Spróbuję zabić proces java ręcznie w poniedziałek i mam nadzieję, że nie zrobię niczyich kroków. – andronikus

+0

Niestety 'jps -l' pokazuje mi tylko JPS! – andronikus