我认为我遇到了与
H2
相关的问题,即它无法正确关闭。我怀疑这是因为在关闭 tomcat 时,我看到了
myDB.lock.db
,但进程并未停止。我使用Tomcat的连接池,数据库的URL为:
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"
来自文档关闭 H2:
通常,当最后一个连接关闭时,数据库会被关闭。... 默认情况下,当最后一个连接关闭时,数据库会被关闭。但是,如果从未关闭,则在虚拟机使用关闭挂钩正常退出时,数据库将关闭。
我不明白我是否做错了什么。
我应该通过命令强制关闭数据库吗?这就是关闭钩子的含义吗?
我在这里做错了什么?
注意:
我在谷歌上找不到如何正确关闭 H2
的示例(除了它会在最后一个连接关闭时自动关闭的陈述)。我应该自己调用 SHUTDOWN
吗?这是正确的方法吗?
我已经看到有投票关闭问题,但没有给出任何理由或关于我正在调查的示例的链接。
更新:
根据 Joonas Pulakka 的回答,我得到了一些额外的信息:
从使用 kill -3
得到的 javacore
中,我看到了线程:
j9thread_t:0x08C9B790, java/lang/Thread:0xE7206CC8, 状态:CW, 优先级=5 3XMTHREADINFO1 (本地线程ID:0xA32, 本地 优先级:0x5, 本地策略:未知) 3XMTHREADINFO2"H2 Log Writer MYAPPLICATION" J9VMThread:0x08DC6F00
(本地堆栈地址范围从:0xE5E26000, 到:0xE5E67000, 大小:0x41000) 3XMTHREADINFO3 Java调用堆栈:
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, 状态:P, 优先级=5
3XMTHREADINFO1 (本地线程ID:0xE1A, 本地
优先级:0x5, 本地策略:未知) 3XMTHREADINFO2
(本地堆栈地址范围从:0xE5F69000, 到:0xE5FAA000,
大小:0x41000) 3XMTHREADINFO3 Java调用堆栈:
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
3XMTHREADINFO "H2文件锁看门狗opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db" J9VMThread:0x08DC6900,j9thread_t:0x08C9BA24,java/ lang/ Thread:0xE71E9018,状态:CW,优先级=9 3XMTHREADINFO1
(本地线程ID:0xA30,本地优先级:0x9,本地策略:UNKNOWN)
3XMTHREADINFO2 (本地堆栈地址范围从:0xE5DBA000到0xE5DFB000,大小为: 0x41000) 3XMTHREADINFO3 Java调用堆栈:
4XESTACKTRACE 在java/lang/Thread.sleep(Native Method)中休眠 4XESTACKTRACE
在java/lang/Thread.sleep(Thread.java:851(编译代码))中休眠 4XESTACKTRACE 在org/h2/store/FileLock.run(FileLock.java:490)中运行 4XESTACKTRACE
在java/lang/Thread.java的736行运行
3XMTHREADINFO "文件监视器" J9VMThread:0x087C0800,j9thread_t:0x08C9B4FC,java/lang/Thread:0xE715D878,状态:CW,优先级=5
3XMTHREADINFO1 (本地线程ID:0xA2C,本地优先级:0x5,本地策略:UNKNOWN) 3XMTHREADINFO2
(本地堆栈地址范围从:0xE5E67000到0xE5EA8000,大小为:)
4XESTACKTRACE 在java/lang/Thread.sleep(Native Method)处 4XESTACKTRACE 在 java/lang/Thread.sleep(Thread.java:851(Compiled Code))处 4XESTACKTRACE 在org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)处
addShutdownHook()
,并使用org.h2.engine.DatabaseCloser
的实例。 - trashgodkill -3
,我从ps -ef
中看到H2
仍然是活动的。此外,我还看到了H2
的db.lock
。因此,我强烈怀疑这是H2
的问题,而不是Tomcat的问题。 - Jim