2011-08-24 81 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