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

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 工作小总结
  • 时间:2023-06-21 11:06
  • 5672人已阅读
简介 问题描述:在使用sqlite的时候,因为使用了将共享目录映射的本地的方式,这样大家就可以使用同一个数据库了。但是当大家同时操作的时候,出现如下图的错误:错误信息是,数据库文件被锁住了。解决方案:访问同一个SQLite数据库可能会导致数据库文件被锁定,而导致出现"[SQLITE_BUSY]Thedatabasefileislocked(databaseislocked)"这个错误

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

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

问题描述:

在使用sqlite的时候,因为使用了将共享目录映射的本地的方式,这样大家就可以使用同一个数据库了。但是当大家同时操作的时候,出现如下图的错误:

479109d30d4c87f001522d822ddbdcf6.png错误信息是,数据库文件被锁住了。

解决方案:

访问同一个SQLite数据库可能会导致数据库文件被锁定,而导致出现 "[SQLITE_BUSY] The database file is locked (database is locked)" 这个错误。解决这个问题可以考虑以下几种方法:

  1. 等待:等待其他客户端释放数据库锁定,然后再重新执行相应的SQL语句。

  2. 优化SQL查询:优化SQL语句或者减少不必要的SQL查询可以减少数据库锁定的发生。

  3. 分离SQL执行:将查询分为不同的事务,或者尽可能少地在同一个事务中同时执行多个查询。

  4. 使用共享高速缓存:在多客户端访问同一个SQLite数据库时,可以尝试使用共享高速缓存,以减少数据库锁定的发生。

  5. 使用WAL模式:WAL模式可以减少数据库锁定的发生,并且在高并发的情况下,具有更好的性能。可以通过配置PRAGMA journal_mode=wal来使用WAL模式。

实际采用方案:

凯哥使用了第5种方案。直接在配置文件中天津jourmal_mode。在yaml文件中,配置SQLite数据库链接如下:

664e675eee148f2e82471aadec6f9530.png

361d29ff4b648aee904bece2955da767.png

  1. 在上面的配置中,journal_mode: WAL 表示启用WAL模式。同时设置了超时时长、线程池的大小、锁类型

注意:不是所有的SQLite数据库连接库都支持journal_mode配置项,如果连接库不支持,可以手动在SQLite数据库文件中设置WAL模式。

扩展知识:

sqlit的journal_mode都有哪些模式?

SQLite的journal_mode有以下几种模式:

  1. DELETE(默认模式):SQLite在写入日志数据到主数据库后,会删除日志文件(也就是删除-journal文件),这个过程有可能会导致数据丢失。

  2. TRUNCATE:与DELETE模式相似,SQLite在写入日志数据到主数据库后,会删除日志文件,但是这个过程不会丢失数据。

  3. PERSIST:SQLite在写入日志数据到主数据库后,会将日志数据保存在日志文件中,这个过程不会删除日志文件,并且可以通过日志文件恢复丢失的数据。

  4. MEMORY:SQLite在写入日志数据到主数据库后,不会将日志存储到磁盘上,而是直接保存在内存中,这个过程可以提高写入性能,但是程序崩溃或者机器断电可能会导致数据丢失。

  5. WAL(Write-Ahead Logging):SQLite通过WAL模式来提高写入性能,将日志数据写入到WAL文件中,而不是写入到主数据库中。WAL模式可以支持并发读取和写入操作,并且可以通过WAL文件来恢复丢失的数据。但是,WAL模式需要额外的磁盘空间来存储WAL文件,同时也需要支持WAL模式的SQLite版本。


TopTop