我正在使用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.
那么,我该如何终止这个过程?我无法重启机器,因为它不是我的机器,也无法使用top或查找监视程序ps。我希望Play能够自动关闭它,但我并没有将其构建到我的部署脚本中。
top
ps
如果您到目前为止已经阅读了一百万,请感谢!
我关闭了tomcat
您确定已经完全关闭了tomcat吗?因为H2数据库仍在运行。如果您关闭了tomcat进程,则数据库也将停止(因为在tomcat进程中正在运行H2)。除非您在其他过程中运行数据库。
还是你只是关闭Web应用程序 中 的tomcat?如果是这种情况,则至少没有关闭一个数据库连接,以便数据库保持运行(并创建此.lock.db文件)。
现在,我不知道播放框架,也不能说如何确保所有数据库连接都关闭。
强制关闭数据库的一种方法是运行SQL语句SHUTDOWN。
SHUTDOWN
我找不到带有top或ps的看门狗
top并且ps仅显示 过程 。H2看门狗是Java进程中的一个 线程 。要查看线程,请使用:
jps -l (to get the list of Java processes) jstack -l <pid> (to get a full thread dump)