【已解决】SQLite 共享访问时候提示:The database file is locked (database is locked)
- 工作小总结
- 时间:2023-06-25 10:31
- 3095人已阅读
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
背景描述:
SQLite 共享访问时候提示:The database file is locked (database is locked)
错误信息如下:在上一篇:
【已解决】使用spring boot链接sqlite的时候,并发写的时候提示:The database file is locked (database is locked)
配置如下:
但是在实际中,发下如果这样配置还会出现The database file is locked (database is locked)这个错误。
网络查询后:
根据 SQLite 的官方文档,只有在连接 SQLite 数据库时指定了 journal_mode 参数才会生效,因此在你的配置中设置 journal_mode: WAL
并不会起作用。
在多数据源情况下,如果你在连接每个数据库时都指定了 journal_mode: WAL
参数,则每个数据库都将启用 WAL 模式。如果只指定了其中一个数据源的 journal_mode
参数,则只有该数据源会启用 WAL 模式,其他数据源可能仍然使用默认的 journal 模式。
如果你想在应用启动时设置 SQLite 的 journal 模式,可以考虑在应用启动时调用 SQLite 的 PRAGMA 命令,设置 journal 模式为 WAL。下面是一个示例:
@Bean public InitializingBean initializeSqliteDb() { return () -> { Connection connection = null; try { connection = DriverManager.getConnection("jdbc:sqlite:Z:/sqlite-db/back.db"); Statement statement = connection.createStatement(); statement.execute("PRAGMA journal_mode=WAL;"); } catch (SQLException e) { LOGGER.warn("Failed to set journal mode for SQLite database", e); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { LOGGER.warn("Failed to close SQLite database connection", e); } } } }; }
这里使用了 InitializingBean 接口,在应用启动时会调用该接口的 afterPropertiesSet 方法,在这个方法里执行设置 SQLite journal 模式的操作。当然,你也可以使用其他方式在应用启动时调用该方法。
上面这种方式太复杂了。而且凯哥也使用的是多数据源。
在多数据源配置中,你可以通过在配置文件中设置连接参数来配置 SQLite 数据库的 journal 模式。
在 application.properties 或 application.yml 文件中,为数据源的 URL 添加连接参数 journal_mode=WAL,例如:
spring.datasource.dsOne.url=jdbc:sqlite:path/to/dsOne.db?journal_mode=WAL
这里假设数据源 dsOne 使用的是 SQLite 数据库。目录 path/to/ 应该替换为实际的数据库文件路径。
添加连接参数后,当数据源创建连接时,会自动执行 PRAGMA 命令设置 journal 模式。你无需在代码中显式执行该命令。
根据上面描述修改后的yaml文件配置如下:
重启项目。访问项目,向数据库中写入数据。OK 一切正常