【问题标题】:Play! not shutting down H2 correctly玩!未正确关闭 H2
【发布时间】:2011-11-03 04:40:34
【问题描述】:

我正在使用 Play 编写一个部署在 Tomcat 中的 webapp。因为该应用程序不会处理太多数据,所以我将默认 H2 数据库与 Hibernate 一起使用。当我想部署新版本的应用程序时,我关闭了 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 自动关闭它的方法,但我并没有将其构建到我的部署脚本中。

如果您能读到这里,万分感谢!

【问题讨论】:

  • 还有一点值得一提的是,数据库进程显然最终会死掉。我不确定它需要多长时间,但它以小时为单位。等待它只是一种解决方案,但总比没有好?

标签: java hibernate playframework h2


【解决方案1】:

我关闭了tomcat

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

或者您是否刚刚关闭了 tomcat 中的 Web 应用程序?如果是这种情况,则至少有一个数据库连接没有关闭,因此数据库继续运行(并创建此 .lock.db 文件)。

现在,我不知道play框架,也不能说如何确保所有数据库连接都关闭。

强制关闭数据库的一种方法是运行 SQL 语句SHUTDOWN

用top或ps找不到看门狗

topps 仅显示进程。 H2 看门狗是 java 进程中的一个线程。要查看线程,请使用:

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

【讨论】:

  • 我像往常一样使用sh bin/shutdown.sh 关闭服务器。还有什么我应该做的吗?表演!框架倾向于自动处理这样的事情,所以我不知道如何传递SHUTDOWN 语句。我会在星期一尝试手动杀死 java 进程,希望不要踩到任何人的脚趾。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多