2011-08-24 106 views
6

我正在使用Play來編寫一個部署在Tomcat中的webapp。因爲應用程序不會處理非常多的數據,所以我在Hibernate中使用默認的H2數據庫。當我想部署新版本的應用程序時,我關閉了tomcat,清除舊的Web應用程序和WAR,添加新的WAR,然後開始備份。玩!不正確關閉H2

這工作到幾天前,當我添加數據庫組件。現在,我經常無法重新部署應用程序。當我刪除舊目錄時,它會自動重新生成以下結構:

$ 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文檔的簡短搜索,我認爲這個過程是干擾我的應用的。

編輯

下面是在日誌文件中抱怨行:

​​

所以,我怎麼殺這個過程?我無法重新啓動機器,因爲它不是我的,我無法找到帶有topps的看門狗。我更喜歡Play的方式來自動關閉它,但我並沒有將它構建到我的部署腳本中。

如果您已經閱讀了這篇文章,非常感謝!

+0

另一點值得一提的是數據庫進程顯然最終死亡。我不知道需要多長時間,但它是在幾個小時的規模。等待它只是一種解決方案,但總比沒有好? – andronikus

回答

8

我關閉Tomcat

你確定你已經完全關閉Tomcat?因爲H2數據庫正在運行。如果關閉tomcat進程,數據庫也會停止(因爲H2在tomcat進程中運行)。除非在不同的進程中運行數據庫。

或者你剛剛關閉了web應用程序內的 tomcat?如果是這種情況,那麼至少有一個數據庫連接沒有關閉,這樣數據庫就會繼續運行(並創建這個.lock.db文件)。

現在,我不知道該播放框架,也不能說如何確保所有數據庫連接都關閉。

強制數據庫關閉的一種方法是運行SQL語句SHUTDOWN

我無法找到頂部或ps看門狗

topps只顯示過程。 H2看門狗是在java進程中的線程。要查看線程,請使用:

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

像往常一樣,我正在用'sh bin/shutdown.sh'關閉服務器。還有什麼我應該做的?表演!框架往往會自動處理這樣的事情,所以我不知道如何傳遞'SHUTDOWN'語句。我會在星期一手動殺死java進程,並希望不要踩在任何人的腳趾上。 – andronikus

+0

不幸的是'jps -l'只顯示我JPS本身! – andronikus