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

2022-09-01 16:08:42

这与这篇文章有关。
我认为我对它没有正确关闭的含义有疑问。
我怀疑这一点,因为我看到当我关闭雄猫时,这个过程不会停止。
我使用Tomcat的连接池,数据库的URL是:H2myDB.lock.db
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

从文档关闭 H2

通常,当数据库的最后一个连接关闭时,数据库将关闭。缺省情况下,当最后一个连接关闭时,数据库将关闭。但是,如果它从未关闭,则当虚拟机使用关闭挂钩正常退出数据库时,数据库将关闭

我无法理解我是否做错了什么。
我应该通过命令强制关闭数据库吗?这就是关机挂钩的意思吗?
我在这里做错了什么?

注意:
我在Google中找不到如何正确关闭的示例(除了上次连接关闭时自动关闭的声明)。我应该给自己打电话吗?这是正确的方法吗?
我已经看到关闭问题的投票,但我没有关于我正在调查的示例的原因或链接H2SHUTDOWN

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

从我得到使用一个我看到线程:javacorekill -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(编译代码))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)


答案 1

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

如果关机后仍有文件,则虚拟机未正常退出。您写道,该过程不会停止。你必须找到原因,因为可能这也是阻止H2关闭钩子执行的原因。.lock.db

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

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


答案 2

您可以执行该语句,然后关闭连接。SHUTDOWN

该命令将使 H2 立即释放与连接相关的所有资源。例如,这将允许您在重新部署Web应用程序时摆脱嵌入式H2数据库。SHUTDOWN


推荐