首页 > 解决方案 > 由于文件锁定,H2 数据库未刷新

问题描述

我正在 IDEA Intelli 中运行一个 Spring-Boot 项目,用于使用 REST 完整服务将配方写入数据库的培训。IDE 运行服务器,我使用 Postman 进行查询。

我的问题是 H2 数据库不保留输入的数据。在内存中它很好,但是一旦我关闭并重新启动,数据就消失了。

查看数据库文件,我看到一个跟踪文件,似乎表明数据库没有更新,因为它有一个锁。我已经搜索了一个锁定文件 ( locate *.lock.db),停止了所有 Java 进程,甚至在没有改变行为的情况下重新启动。我已经更改了 H2 的 FILE_LOCK 选项,但问题仍然存在。

编辑:我刚刚注意到我没有尝试过 FILE_LOCK=FILE。我刚试过,数据库没有更新。但是,不会生成跟踪文件。

编辑 2:我忘了说我在 Ubuntu 20.04 上运行。

编辑 3:我正在小心使用 Postman 的“执行器/关机”关机。使用文件锁定,我这样做:

这可能是什么原因造成的?这是我的 trace.db 文件 [注意:当我使用 FILE_LOCK=FILE 时,不会创建任何跟踪文件,所以锁定问题可能是一个红鲱鱼?]:

2021-09-09 07:54:08 database: flush
org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]" [50000-200]
    at org.h2.message.DbException.get(DbException.java:194)
    at org.h2.message.DbException.convert(DbException.java:347)
    at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93)
    at org.h2.mvstore.MVStore.handleException(MVStore.java:2877)
    at org.h2.mvstore.MVStore.panic(MVStore.java:481)
    at org.h2.mvstore.MVStore.<init>(MVStore.java:402)
    at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579)
    at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170)
    at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103)
    at org.h2.engine.Database.getPageStore(Database.java:2659)
    at org.h2.engine.Database.open(Database.java:675)
    at org.h2.engine.Database.openDatabase(Database.java:307)
    at org.h2.engine.Database.<init>(Database.java:301)
    at org.h2.engine.Engine.openSession(Engine.java:74)
    at org.h2.engine.Engine.openSession(Engine.java:192)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171)
    at org.h2.engine.Engine.createSession(Engine.java:166)
    at org.h2.engine.Engine.createSession(Engine.java:29)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152)
    at org.h2.Driver.connect(Driver.java:69)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
    at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:725)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:711)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]" [50000-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    ... 33 more
Caused by: java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]
    at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950)
    at org.h2.mvstore.FileStore.open(FileStore.java:166)
    at org.h2.mvstore.MVStore.<init>(MVStore.java:381)
    ... 27 more
Caused by: java.nio.channels.OverlappingFileLockException
    at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229)
    at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123)
    at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154)
    at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121)
    at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165)
    at org.h2.mvstore.FileStore.open(FileStore.java:163)
    ... 28 more
2021-09-09 07:54:08 database: flush
org.h2.message.DbException: General error: "java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]" [50000-200]
    at org.h2.message.DbException.get(DbException.java:194)
    at org.h2.message.DbException.convert(DbException.java:347)
    at org.h2.mvstore.db.MVTableEngine$1.uncaughtException(MVTableEngine.java:93)
    at org.h2.mvstore.MVStore.handleException(MVStore.java:2877)
    at org.h2.mvstore.MVStore.panic(MVStore.java:481)
    at org.h2.mvstore.MVStore.<init>(MVStore.java:402)
    at org.h2.mvstore.MVStore$Builder.open(MVStore.java:3579)
    at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:170)
    at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:103)
    at org.h2.engine.Database.getPageStore(Database.java:2659)
    at org.h2.engine.Database.open(Database.java:675)
    at org.h2.engine.Database.openDatabase(Database.java:307)
    at org.h2.engine.Database.<init>(Database.java:301)
    at org.h2.engine.Engine.openSession(Engine.java:74)
    at org.h2.engine.Engine.openSession(Engine.java:192)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171)
    at org.h2.engine.Engine.createSession(Engine.java:166)
    at org.h2.engine.Engine.createSession(Engine.java:29)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152)
    at org.h2.Driver.connect(Driver.java:69)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)
    at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:725)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:711)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]" [50000-200]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:505)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
    ... 33 more
Caused by: java.lang.IllegalStateException: The file is locked: nio:/home/knute/IdeaProjects/recipes_db.mv.db [1.4.200/7]
    at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950)
    at org.h2.mvstore.FileStore.open(FileStore.java:166)
    at org.h2.mvstore.MVStore.<init>(MVStore.java:381)
    ... 27 more
Caused by: java.nio.channels.OverlappingFileLockException
    at java.base/sun.nio.ch.FileLockTable.checkList(FileLockTable.java:229)
    at java.base/sun.nio.ch.FileLockTable.add(FileLockTable.java:123)
    at java.base/sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1154)
    at org.h2.store.fs.FileNio.tryLock(FilePathNio.java:121)
    at java.base/java.nio.channels.FileChannel.tryLock(FileChannel.java:1165)
    at org.h2.mvstore.FileStore.open(FileStore.java:163)
    ... 28 more

...和 ​​application.properties 文件 [注意:在我当前的迭代中,我使用的是 FILE_LOCK=FILE]:

# Required by HyperSkill
server.port=8881
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
spring.datasource.url=jdbc:h2:file:../recipes_db

# Solves file locking problem? No.
#spring.datasource.url=jdbc:h2:file:../recipes_db;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO
#spring.datasource.url=jdbc:h2:file:../recipes_db;FILE_LOCK=NO
#spring.datasource.url=jdbc:h2:file:../recipes_db;FILE_LOCK=SOCKET
#spring.datasource.url=jdbc:h2:file:../recipes_db;FILE_LOCK=FS

# Needed?
spring.datasource.auto-commit=true

# To remove warning
spring.jpa.open-in-view=true

标签: javaspring-booth2

解决方案


我发现了问题!添加debug=true到 applications.properties 文件中,我看到了这个:

Starting delayed evictData of schema as part of SessionFactory shut-down

所以出于某种原因,Spring 明确地放弃了我的表!将此添加到 applications.properties 文件中会停止:

spring.jpa.hibernate.ddl-auto=update

推荐阅读