【已解决】SQLite 共享访问时候提示:The database file is locked (database is locked)

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 工作小总结
  • 时间:2023-06-25 10:31
  • 3095人已阅读
简介 背景描述:SQLite共享访问时候提示:Thedatabasefileislocked(databaseislocked)错误信息如下:在上一篇:【已解决】使用springboot链接sqlite的时候,并发写的时候提示:Thedatabasefileislocked(databaseislocked)配置如下:但是在实际中,发下如果这样配置还会出现Thedatabasefileislocked(

🔔🔔好消息!好消息!🔔🔔

有需要的朋友👉:微信号 kaigejava2022

背景描述:

SQLite 共享访问时候提示:The database file is locked (database is locked)

错误信息如下:
在上一篇:

【已解决】使用spring boot链接sqlite的时候,并发写的时候提示:The database file is locked (database is locked)

配置如下:

93a8dda2d67902b4c02db305efaf35cf.png

但是在实际中,发下如果这样配置还会出现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文件配置如下:

c66fd3149f38620fea750e12abf8655b.png

重启项目。访问项目,向数据库中写入数据。OK 一切正常

TopTop