当前位置: 首页 > 面试题库 >

无法正确关闭H2

农鸿达
2023-03-14
问题内容

我正在使用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能够自动关闭它,但我并没有将其构建到我的部署脚本中。

如果您到目前为止已经阅读了一百万,请感谢!


问题答案:

我关闭了tomcat

您确定已经完全关闭了tomcat吗?因为H2数据库仍在运行。如果您关闭了tomcat进程,则数据库也将停止(因为在tomcat进程中正在运行H2)。除非您在其他过程中运行数据库。

还是你只是关闭Web应用程序 的tomcat?如果是这种情况,则至少没有关闭一个数据库连接,以便数据库保持运行(并创建此.lock.db文件)。

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

强制关闭数据库的一种方法是运行SQL语句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)


 类似资料:
  • 问题内容: 我想在Java中实现SSL代理。我基本上打开了两个套接字,并运行了两个线程,这些线程将写入他们从中读取的内容,反之亦然。每个线程如下所示: 每个线程只会关闭输入套接字,因此最终两个套接字都会关闭。 但是,如果我想使用an 怎么办?似乎那里不支持这些方法。这是我得到的例外。 我想出的是: 每当套接字结束时,我都必须捕获并忽略套接字末尾异常。 我的问题是: 如果不受支持,我怎么会从那里得到

  • 我正在处理一个需要使用jFileChooser Swing窗口的项目。当单击“取消”或“打开”时,窗口不会关闭。在查看了StackOverflow上的许多文章以及JFileChooser教程和文档之后,我不知道是什么导致了这个重复的问题。 我正在与NetBeans一起使用它的swing编辑器。我也在Eclipse中尝试了该程序作为测试,并收到了相同的结果。

  • 我错过了什么关于正确关闭生产者和消费者的事情吗?

  • 问题内容: 当我运行以下脚本时,两个lambda都在同一文件junk.txt上运行os.startfile()。我希望每个Lambda都使用创建Lambda时设置的值“ f”。有没有办法让它按我的预期运行? 问题答案: 一种方法是执行此操作: 否则,在调用该函数时将进行查找,因此您将获得当前(循环后)的值。 我更喜欢的方式: 甚至(在python 2.5+中):

  • 我正在使用CloseableHttpResponse(来自apache-httpclient-4.5.3),但我不确定我是否正确使用了它,我看到了一个答案,没有投票支持使用: 是抽象的,没有可调用的close方法,尽管在这个回答中使用了: 目前,我正在使用try with resources,用于send方法内部的和。 我是否缺少任何打开的资源或以错误的方式使用它?

  • 问题内容: 我有全部传播异常的方法,然后在一个地方处理,但是我意识到了一些事情。 假设我有这样的方法 我的问题是,如果doSometing()方法引发异常,该语句将不会关闭,但我不想在那里处理异常。尝试并捕获只会抛出异常并最终关闭语句的正确方法吗? 问题答案: