Jim*_*Jim 23 java tomcat database-connection jdbc h2
这与这篇文章有关.
我认为我的H2意思是它没有正确关闭.
我怀疑这是因为我看到myDB.lock.db我关闭tomcat并且进程没有停止.
我使用Tomcat的连接池,数据库的URL是:
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"
从文件关闭H2:
通常,数据库在最后一次连接关闭时关闭....默认情况下,数据库在最后一个连接关闭时关闭.但是,如果它从未关闭,则在虚拟机使用关闭挂钩正常退出时,数据库将关闭
我无法理解我是否做错了什么.
我应该通过命令强制关闭数据库吗?这是关机钩子的意思吗?
我在这做错了什么?
注意:
我在Google中找不到如何H2正确关闭的示例(除了它在上次连接关闭时自动关闭的声明).我应该给SHUTDOWN自己打电话吗 这是正确的方法吗?
我已经看到投票来结束这个问题了,但我正在研究的一个例子没有理由或联系
更新:
在Joonas Pulakka回答一些额外信息之后:
从javacore我使用kill -3我看到的线程:
"H2 Log Writer MYAPPLICATION"J9VMThread:0x08DC6F00,j9thread_t:0x08C9B790,java/lang/Thread:0xE7206CC8,状态:CW,prio = 5 3XMTHREADINFO1(本机线程ID:0xA32,原生优先级:0x5,本机策略:UNKNOWN)3XMTHREADINFO2
(原生)堆栈地址范围从:0xE5E26000,到:0xE5E67000,大小:0x41000)3XMTHREADINFO3 Java callstack:
java/lang/Object.wait上的
4XESTACKTRACE (本机方法)java/lang/Object.wait上的4XESTACKTRACE(Object.java:196(编译代码) ))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,本机策略:UNKNOWN )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(编译代码))4XESTACKTRACE at java/util/concurrent/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:958(Compiled Code))4XESTACKTRACE at java/util/concurrent/ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918) java/lang/Thread.run中的4XESTACKTRACE(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
(本机线程ID:0xA30,本机优先级:0x9,本机策略:UNKNOWN)
3XMTHREADINFO2(本机堆栈地址范围:0xE5DBA000,到:0xE5DFB000,大小:0x41000)3XMTHREADINFO3 Java callstack:java/lang/Thread.sleep中的4XESTACKTRACE(本机方法) )
java/lang/Thread.sleep上的4XESTACKTRACE (Thread.java:851(编译代码))
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,状态:CW,
prio = 5 3XMTHREADINFO1(本机线程ID:0xA2C,本机优先级:0x5,本机策略:UNKNOWN)3XMTHREADINFO2
(本机堆栈地址)范围从:0xE5E67000,到:0xE5EA8000,大小:0x41000)3XMTHREADINFO3 Java callstack:
java/lang上的4XESTACKTRACE/Thread.sleep(本机方法)java/lang/Thread.sleep上的4XESTACKTRACE(Thread.java:851(编译代码)) 4xESTACKTRACE at org/apache/log4j/helpers/FileWatchdog.run(FileWatchdog.java:104)
文档说明当虚拟机正常退出时,H2数据库连接将关闭.这就是它的作用.默认情况下,关闭挂钩已存在,您无需执行任何操作.关闭钩子是一种完全有效的关闭资源的方法,只需要在退出时关闭.
如果.lock.db关闭后仍有文件,则虚拟机无法正常退出.你写道,这个过程并没有停止.你必须找到原因,因为这也可能阻止H2关闭钩子的执行.
对于大型数据库,关闭可能需要一些时间.请参阅调试器(例如VisualVM),在调用(Tomcat)关闭后,哪些线程保持活动状态.
有更多的可能性:设置文件权限,以便H2可以创建锁定文件,但不能删除它们.如果操作系统阻止H2删除其锁定文件,那么H2就无法做到这一点.
您可以执行该语句SHUTDOWN,然后关闭连接。
该SHUTDOWN命令将使 H2 立即释放与连接相关的所有资源。例如,这将允许您在重新部署 Web 应用程序时摆脱嵌入式 H2 数据库。
通过查看DbStarter.contextDestroyed()的代码(感谢Allan5的回答),这里是可以工作的代码:
connection.createStatement().execute("SHUTDOWN");
Run Code Online (Sandbox Code Playgroud)
所以Aaron Digulla的回答是正确的(即使不是完全“复制/粘贴”)。
此外,如果您使用 启动了一个 H2 TCP 服务器server = Server.createTcpServer("-tcpAllowOthers"),您可以简单地使用 停止它server.stop()。
| 归档时间: |
|
| 查看次数: |
25619 次 |
| 最近记录: |