Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭H2的正确方法是什么?_Java_Tomcat_Jdbc_Database Connection_H2 - Fatal编程技术网

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

Java 关闭H2的正确方法是什么?,java,tomcat,jdbc,database-connection,h2,Java,Tomcat,Jdbc,Database Connection,H2,这与此相关。 我想我对H2有问题,这意味着它不能正常关闭。 我怀疑这一点,因为当我关闭tomcat并且进程没有停止时,我看到了myDB.lock.db。 我使用Tomcat的连接池,数据库的url是: url=“jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema” 从文档: 通常,当数据库的最后一个连接断开时,数据库关闭 关闭默认情况下,上次连接时关闭数据库 关门了。但是,如果数据库

这与此相关。
我想我对
H2有问题,这意味着它不能正常关闭。
我怀疑这一点,因为当我关闭tomcat并且进程没有停止时,我看到了
myDB.lock.db

我使用Tomcat的连接池,数据库的url是:
url=“jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema”

从文档:

通常,当数据库的最后一个连接断开时,数据库关闭 关闭默认情况下,上次连接时关闭数据库 关门了。但是,如果数据库从未关闭,则在 虚拟机使用关机挂钩正常退出

我不明白我是否做错了什么事。
我应该通过命令强制关闭数据库吗?这就是关机挂钩的意思吗?
我做错了什么

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

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

javacore
中,我使用
kill-3
获得了以下线程:

“H2日志编写器MYAPPLICATION”J9VMThread:0x08DC6F00, j9thread_t:0x08C9B790,java/lang/Thread:0xE7206CC8,状态:CW,优先级=5 3XMTHREADINFO1(本机线程ID:0xA32,本机 优先级:0x5,本机策略:未知)3XMTHREADINFO2
(本机堆栈地址范围从:0xE5E26000到:0xE5E67000, 大小:0x41000)3XMTHREADINFO3 Java调用堆栈:
4XESTACKTRACE位于java/lang/Object.wait(本机方法)
4XESTACKTRACE在 java/lang/Object.wait(Object.java:196(编译代码))4XESTACKTRACE 位于org/h2/store/WriterThread.run(WriterThread.java:102)
java/lang/Thread.run上的4XESTACKTRACE(Thread.java:736)

3XMTHREADINFO“pool-8-thread-1”J9VMThread:0x087C0200, j9thread\u t:0x0840566C,java/lang/Thread:0xE79BFC80,状态:P,prio=5
3XMTHREADINFO1(本机线程ID:0xE1A,本机 优先级:0x5,本机策略:未知)3XMTHREADINFO2
(本机堆栈地址范围从:0xE5F69000到:0xE5FAA000, 大小:0x41000)3XMTHREADINFO3 Java调用堆栈:
4在sun/misc/Unsafe.park(本机方法)进行的EstackTrace
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) java/lang/Thread.run上的4XESTACKTRACE(Thread.java:736)

3XMTHREADINFO“H2文件锁看门狗 opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db“ J9VMThread:0x08DC6900,j9thread\u t:0x08C9BA24,ja
va/lang/Thread:0xE71E9018,状态:CW,优先级=9 3XMTHREADINFO1
(本机线程ID:0xA30,本机优先级:0x9,本机策略:未知)
3XMTHREADINFO2(本机堆栈地址范围为:0xE5DBA000, 收件人:0xE5DFB000,大小:0x41000)3XMTHREADINFO3 Java 调用堆栈:4XESTACKTRACE位于 java/lang/Thread.sleep(本机方法)4XESTACKTRACE
在java/lang/Thread.sleep(Thread.java:851(编译代码))
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调用堆栈:
java/lang/Thread.sleep上的4XESTACKTRACE(本机方法) 4XESTACKTRACE在 java/lang/Thread.sleep(Thread.java:851(编译代码))4XESTACKTRACE 位于org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)


不,关闭钩子只是JVM终止时运行的线程,不管是从main()返回、调用System.exit(int)还是抛出异常。只有JVM崩溃才能避免它。请参阅Runtime.addShutdownHook(Thread)。

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

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

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

还有更多的可能性:文件权限设置为H2可以创建锁定文件,但不能删除它们。如果操作系统阻止H2删除其锁文件,则没有
<listener>
    <listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>
@PersistenceUnit(unitName="myEm")
private EntityManagerFactory emf;

public void doStuff() {
    EntityManager em = emf.createEntityManager();
    ...
    em.close(); // forgot this line
}