这与此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)
发布于 2012-04-02 15:57:14
文档显示,当虚拟机正常退出时,H2数据库连接将关闭。这就是它的作用。默认情况下,shutdown钩子已经存在,您无需执行任何操作。shutdown钩子是一种完全有效的关闭资源的方法,这些资源只需要在退出时关闭。
如果关机后仍有.lock.db
文件,则虚拟机未正常退出。您写道,该进程不会停止。您必须找到原因,因为这可能也是阻止H2关闭钩子执行的原因。
对于大型数据库,关闭可能需要一些时间。使用调试器(例如VisualVM)查看哪些线程在您调用(Tomcat)关闭后仍保持活动。
还有更多的可能性:设置文件权限,以便H2可以创建锁定文件,但不能删除它们。如果操作系统阻止H2删除它的锁文件,H2对此无能为力。
发布于 2016-11-23 18:47:05
通过查看DbStarter.contextDestroyed()
的代码(感谢Allan5的answer),下面是可以工作的代码:
connection.createStatement().execute("SHUTDOWN");
因此,Aaron Digulla的answer是正确的(即使不是完全“复制/粘贴”)。
此外,如果您已经使用server = Server.createTcpServer("-tcpAllowOthers")
启动了H2 TCP服务器,则只需使用server.stop()
即可将其停止。
发布于 2016-10-19 23:24:29
您可以执行语句SHUTDOWN
,然后关闭连接。
SHUTDOWN
命令将使H2立即释放与连接相关的所有资源。例如,当您重新部署web应用程序时,这将允许您摆脱嵌入式H2数据库。
https://stackoverflow.com/questions/9972372
复制相似问题