关闭 H2 的正确方法是什么? [英] What is the proper way to close H2?

查看:25
本文介绍了关闭 H2 的正确方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

This is related to this post.
I think I am having problem with H2 meaning that it does not close properly.
I suspect this since I see myDB.lock.db when I shutdown tomcat and the process does not stop.
I use Tomcat's connection pooling and the url to the database is:
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

来自文档关闭 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

我不明白我做错了什么.
我应该通过命令强制关闭数据库吗?这是关闭钩子的意思吗?
我在这里做错了什么?

I can not understand if I am doing something wrong.
Should I be forcing the database to close via a command? Is this the meaning of shutdown hook?
What am I doing wrong here?

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

Note:
I can not find in Google an example of how to close H2 properly (besides the statement that it closes automatically on last connection shutdown). Should I call SHUTDOWN myself? Is this the proper approach?
I already see votes to close the question but there has not been a reason or link on an example of what I am investigating

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

UPDATE:
After Joonas Pulakka answer some extra info:

javacore 我得到了一个 kill -3 我看到了线程:

From the javacore I got using a kill -3 I see the threads:

"H2 Log Writer MYAPPLICATION" J9VMThread:0x08DC6F00,j9thread_t:0x08C9B790, java/lang/Thread:0xE7206CC8, state:CW, prio=53XMTHREADINFO1(本机线程 ID:0xA32,本机优先级:0x5,本地策略:未知)3XMTHREADINFO2
(本机堆栈地址范围从:0xE5E26000,到:0xE5E67000,大小:0x41000) 3XMTHREADINFO3 Java 调用堆栈:
4XESTACKTRACE at java/lang/Object.wait(Native Method)
4XESTACKTRACE 在java/lang/Object.wait(Object.java:196(Compiled Code)) 4XESTACKTRACE在 org/h2/store/WriterThread.run(WriterThread.java:102)
4XESTACKTRACE 在 java/lang/Thread.run(Thread.java:736)

"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(本机线程 ID:0xE1A,本机优先级:0x5,本地策略:未知)3XMTHREADINFO2
(本机堆栈地址范围从:0xE5F69000,到:0xE5FAA000,大小:0x41000) 3XMTHREADINFO3 Java 调用堆栈:
4XESTACKTRACE at sun/misc/Unsafe.park(本地方法)
4XESTACKTRACE 在java/util/concurrent/locks/LockSupport.park(LockSupport.java:184(编译代码)) 4XESTACKTRACE 在java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1998(编译代码)) 4XESTACKTRACE 在java/util/concurrent/LinkedBlockingQueue.take(LinkedBlockingQueue.java:413(编译代码)) 4XESTACKTRACE 在java/util/concurrent/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:958(编译代码)) 4XESTACKTRACE 在java/util/concurrent/ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)4XESTACKTRACE 在 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 文件锁看门狗opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db"J9VMThread:0x08DC6900, j9thread_t:0x08C9BA24, ja
va/lang/Thread:0xE71E9018, state:CW, prio=9 3XMTHREADINFO1
(本机线程 ID:0xA30,本机优先级:0x9,本机策略:UNKNOWN)
3XMTHREADINFO2(本机堆栈地址范围从:0xE5DBA000,to:0xE5DFB000, size:0x41000) 3XMTHREADINFO3 Java调用堆栈:4XESTACKTRACE 在java/lang/Thread.sleep(本机方法) 4XESTACKTRACE
在 java/lang/Thread.sleep(Thread.java:851(Compiled Code))
4XESTACKTRACE 在org/h2/store/FileLock.run(FileLock.java:490) 4XESTACKTRACE
在 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(本机线程 ID:0xA2C,本机优先级:0x5,本地策略:未知)3XMTHREADINFO2
(本机堆栈地址范围从:0xE5E67000,到:0xE5EA8000,大小:0x41000) 3XMTHREADINFO3 Java 调用堆栈:
4XESTACKTRACE 在 java/lang/Thread.sleep(本地方法)4XESTACKTRACE 在java/lang/Thread.sleep(Thread.java:851(Compiled Code)) 4XESTACKTRACE在 org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)

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连接关闭.这就是它的作用.默认情况下,关闭挂钩已经存在,您无需执行任何操作.关闭钩子是关闭资源的一种完全有效的方式,只需要在退出时关闭.

The documentation says that H2 db connection is closed when the virtual machine exits normally. And that's what it does. The shutdown hook is already there by default, you don't have to do anything. The shutdown hook is a perfectly valid way of closing resources that only need to be closed when quitting.

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

If you have .lock.db files remaining after shutdown, then the virtual machine didn't exit normally. You wrote that the process does not stop. You have to find the reason for that, because probably that's what also prevents the H2 shutdown hook from executing.

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

With big databases, closing could take some time. See with debugger (e.g. VisualVM) what threads remain active after you've invoked (Tomcat) shutdown.

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

There's on more possibility: file permissions are set so that H2 can create the lock files, but cannot delete them. If the OS prevents H2 from deleting its lock files, there's not much H2 could do about it.

这篇关于关闭 H2 的正确方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆