玩!没有正确关闭H2

时间:2011-08-24 21:28:39

标签: java hibernate playframework h2

我正在使用Play来编写部署在Tomcat中的webapp。因为应用程序不会处理非常多的数据我正在使用Hibernate的默认H2数据库。当我想部署新版本的应用程序时,我关闭tomcat,擦除旧的webapp和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文档的简要搜索,我认为这个过程正在干扰我的应用程序。

修改

以下是日志文件中的抱怨行:

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.

那么,我该怎么杀这个过程呢?我无法重新启动机器,因为它不是我的,我找不到topps的看门狗。我更喜欢Play的一种方式来自动关闭它,但我不会将它构建到我的部署脚本之上。

如果你已经阅读过这篇文章,那么万分感谢!

1 个答案:

答案 0 :(得分:9)

  

我关闭了tomcat

你确定你完全关闭了tomcat吗?因为H2数据库正在运行。如果关闭tomcat进程,数据库也会停止(因为H2在tomcat进程中运行)。除非您在不同的进程中运行数据库。

或者您刚刚关闭 tomcat中的Web应用程序?如果是这种情况,则至少一个数据库连接未关闭,以便数据库继续运行(并创建此.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)