java - 关闭H2的正确方法是什么?

标签 java tomcat jdbc database-connection h2

这与 post 有关.
我认为我遇到了 H2 问题,这意味着它没有正确关闭。
我怀疑这是因为我在关闭 tomcat 时看到 myDB.lock.db 并且进程没有停止。
我使用Tomcat的连接池,数据库的url是:
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

来自文档 close H2 :

Usually, a database is closed when the last connection to it is closed.... By default, a database is closed when the last connection is closed. However, if it is never closed, the database is closed when the virtual machine exits normally, using a shutdown hook

我不明白我是否做错了什么。
我应该通过命令强制数据库关闭吗?这就是shutdown hook的意思吗?
我在这里做错了什么?

注意:
我在 Google 中找不到如何正确关闭 H2 的示例(除了它在上次连接关闭时自动关闭的声明)。我应该自己调用 SHUTDOWN 吗?这是正确的方法吗?
我已经看到投票结束了这个问题,但我正在调查的示例没有理由或链接

更新:
在 Joonas Pulakka 回答一些额外信息后:

javacore 我使用 kill -3 我看到了线程:

"H2 Log Writer MYAPPLICATION" J9VMThread:0x08DC6F00, j9thread_t:0x08C9B790, java/lang/Thread:0xE7206CC8, state:CW, prio=5 3XMTHREADINFO1 (native thread ID:0xA32, native priority:0x5, native policy:UNKNOWN) 3XMTHREADINFO2
(native stack address range from:0xE5E26000, to:0xE5E67000, size:0x41000) 3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at java/lang/Object.wait(Native Method)
4XESTACKTRACE at java/lang/Object.wait(Object.java:196(Compiled Code)) 4XESTACKTRACE at org/h2/store/WriterThread.run(WriterThread.java:102)
4XESTACKTRACE at java/lang/Thread.run(Thread.java:736)

3XMTHREADINFO "pool-8-thread-1" J9VMThread:0x087C0200, j9thread_t:0x0840566C, java/lang/Thread:0xE79BFC80, state:P, prio=5
3XMTHREADINFO1 (native thread ID:0xE1A, native priority:0x5, native policy:UNKNOWN) 3XMTHREADINFO2
(native stack address range from:0xE5F69000, to:0xE5FAA000, size:0x41000) 3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at sun/misc/Unsafe.park(Native Method)
4XESTACKTRACE at java/util/concurrent/locks/LockSupport.park(LockSupport.java:184(Compiled Code)) 4XESTACKTRACE at java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1998(Compiled Code)) 4XESTACKTRACE at java/util/concurrent/LinkedBlockingQueue.take(LinkedBlockingQueue.java:413(Compiled Code)) 4XESTACKTRACE at java/util/concurrent/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:958(Compiled Code)) 4XESTACKTRACE at java/util/concurrent/ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 4XESTACKTRACE at java/lang/Thread.run(Thread.java:736)

3XMTHREADINFO "H2 File Lock Watchdog opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db" J9VMThread:0x08DC6900, j9thread_t:0x08C9BA24, ja
va/lang/Thread:0xE71E9018, state:CW, prio=9 3XMTHREADINFO1
(native thread ID:0xA30, native priority:0x9, native policy:UNKNOWN)
3XMTHREADINFO2 (native stack address range from:0xE5DBA000, to:0xE5DFB000, size:0x41000) 3XMTHREADINFO3 Java callstack: 4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE
at java/lang/Thread.sleep(Thread.java:851(Compiled Code))
4XESTACKTRACE at org/h2/store/FileLock.run(FileLock.java:490) 4XESTACKTRACE
at java/lang/Thread.run(Thread.java:736)

3XMTHREADINFO "FileWatchdog" J9VMThread:0x087C0800, j9thread_t:0x08C9B4FC, java/lang/Thread:0xE715D878, state:CW, prio=5
3XMTHREADINFO1 (native thread ID:0xA2C, native priority:0x5, native policy:UNKNOWN) 3XMTHREADINFO2
(native stack address range from:0xE5E67000, to:0xE5EA8000, size:0x41000) 3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE at java/lang/Thread.sleep(Thread.java:851(Compiled Code)) 4XESTACKTRACE at org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)

最佳答案

文档说虚拟机正常退出时H2 db连接关闭。这就是它的作用。默认情况下,关闭 Hook 已经存在,您无需执行任何操作。关闭钩子(Hook)是关闭只需要在退出时关闭的资源的一种完全有效的方法。

如果关机后还有.lock.db文件,说明虚拟机没有正常退出。您写道进程不会停止。您必须找到原因,因为这可能也是阻止 H2 关闭 Hook 执行的原因。

对于大型数据库,关闭可能需要一些时间。使用调试器(例如 VisualVM)查看在您调用 (Tomcat) 关闭后哪些线程仍处于 Activity 状态。

还有更多可能性:设置文件权限,以便 H2 可以创建锁定文件,但不能删除它们。如果操作系统阻止 H2 删除其锁定文件,则 H2 无能为力。

关于java - 关闭H2的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9972372/

相关文章:

java - 在 tomcat 5.5 中部署时出错

java - 为什么 Oracle Pivot 产生不存在的结果?

Java MySQL 连接未关闭

java - 将结果集转换为 json 的最佳方法是什么

Java 线程管理和应用程序流程

java - 如果一行包含 JavaFX 中的特定文本,如何突出显示该行

java - 查找并显示字符串中的连续重复组合

java - 配置 Web 应用程序的不同方法

java - 获取经度和纬度

java - Spring 启动 : Use different Tomcat Version