首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >关闭H2的正确方法是什么?

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

Stack Overflow用户
提问于 2012-04-02 15:26:12
回答 5查看 34K关注 0票数 27

这与此post相关。

我想我在H2上遇到了问题,这意味着它不能正常关闭。

我怀疑这一点,因为当我关闭tomcat时看到了myDB.lock.db,并且进程没有停止。

我使用Tomcat的连接池,数据库的url是:

url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

从文档close H2

通常,当与数据库的最后一个连接关闭时,该数据库就会关闭...默认情况下,数据库在最后一个连接关闭时关闭。但是,如果数据库从未关闭,则当虚拟机正常退出时,将使用关闭钩子关闭数据库

我不明白我是不是做错了什么。

我应该通过命令强制关闭数据库吗?这是关机钩子的意思吗?

我在这里做错了什么?

备注:

我在谷歌中找不到一个如何正确关闭H2的例子(除了它在最后一个连接关闭时自动关闭的声明之外)。我应该自己打电话给SHUTDOWN吗?这是正确的方法吗?

我已经看到了结束这个问题的投票,但我正在调查的例子中没有原因或链接

更新:

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

从我使用kill -3获得的javacore中,我可以看到线程:

"H2日志编写器MYAPPLICATION“J9VMThread:0x08DC6F00,j9thread_t:0x08C9B790,java/lang/ thread :0xE7206CC8,state:CW,prio=5 3XMTHREADINFO1 (本机线程ID:0xA32,本机优先级:0x5,本机策略:未知) 3XMTHREADINFO2

(本机堆栈地址范围从:0xE5E26000到:0xE5E67000,大小:0x41000) 3XMTHREADINFO3 Java callstack:

4XESTACKTRACE at java/lang/Object.wait(本机方法)

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,状态:p,prio=5

3XMTHREADINFO1 (本机线程ID:0xE1A,本机优先级:0x5,本机策略:未知) 3XMTHREADINFO2

(本机堆栈地址范围从:0xE5F69000,到:0xE5FAA000,大小:0x41000) 3XMTHREADINFO3 Java callstack:

4XESTACKTRACE at sun/misc/Unsafe.park(本机方法)

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文件锁监视器opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db“J9VMThread:0x08DC6900,j9thread_t:0x08C9BA24,ja

va/语言/线程:0xE71E9018,状态:CW,prio=9 3XMTHREADINFO1

(原生线程ID:0xA30,原生优先级:0x9,原生策略:未知)

3XMTHREADINFO2 (本机堆栈地址范围:0xE5DBA000,到:0xE5DFB000,大小:0x41000) 3XMTHREADINFO3 Java callstack: 4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE

在java/lang/Thread.sleep(Thread.java:851(Compiled代码中))

4XESTACKTRACE位于org/h2/store/FileLock.run(FileLock.java:490) 4XESTACKTRACE

在java/lang/Thread.run(Thread.java:736) 3XMTHREADINFO "FileWatchdog“J9VMThread:0x087C0800,j9thread_t:0x08C9B4FC,java/lang/Thread:0xE715D878,状态:CW,prio=5

3XMTHREADINFO1 (本地线程ID:0xA2C,本地优先级:0x5,本地策略:未知) 3XMTHREADINFO2

(本机堆栈地址范围从:0xE5E67000到:0xE5EA8000,大小:0x41000) 3XMTHREADINFO3 Java callstack:

4XESTACKTRACE at java/lang/Thread.sleep(本机方法) 4XESTACKTRACE at java/lang/Thread.sleep(Thread.java:851(Compiled Code)) 4XESTACKTRACE at org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-02 15:57:14

文档显示,当虚拟机正常退出时,H2数据库连接将关闭。这就是它的作用。默认情况下,shutdown钩子已经存在,您无需执行任何操作。shutdown钩子是一种完全有效的关闭资源的方法,这些资源只需要在退出时关闭。

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2016-11-23 18:47:05

通过查看DbStarter.contextDestroyed()的代码(感谢Allan5answer),下面是可以工作的代码:

代码语言:javascript
复制
connection.createStatement().execute("SHUTDOWN");

因此,Aaron Digullaanswer是正确的(即使不是完全“复制/粘贴”)。

此外,如果您已经使用server = Server.createTcpServer("-tcpAllowOthers")启动了H2 TCP服务器,则只需使用server.stop()即可将其停止。

票数 6
EN

Stack Overflow用户

发布于 2016-10-19 23:24:29

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9972372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档