【已解决】使用spring boot链接sqlite的时候,并发写的时候提示:The database file is locked (database is locked)
- 工作小总结
- 时间:2023-06-21 11:06
- 5672人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
问题描述:
在使用sqlite的时候,因为使用了将共享目录映射的本地的方式,这样大家就可以使用同一个数据库了。但是当大家同时操作的时候,出现如下图的错误:
错误信息是,数据库文件被锁住了。
解决方案:
访问同一个SQLite数据库可能会导致数据库文件被锁定,而导致出现 "[SQLITE_BUSY] The database file is locked (database is locked)" 这个错误。解决这个问题可以考虑以下几种方法:
等待:等待其他客户端释放数据库锁定,然后再重新执行相应的SQL语句。
优化SQL查询:优化SQL语句或者减少不必要的SQL查询可以减少数据库锁定的发生。
分离SQL执行:将查询分为不同的事务,或者尽可能少地在同一个事务中同时执行多个查询。
使用共享高速缓存:在多客户端访问同一个SQLite数据库时,可以尝试使用共享高速缓存,以减少数据库锁定的发生。
使用WAL模式:WAL模式可以减少数据库锁定的发生,并且在高并发的情况下,具有更好的性能。可以通过配置PRAGMA journal_mode=wal来使用WAL模式。
实际采用方案:
凯哥使用了第5种方案。直接在配置文件中天津jourmal_mode。在yaml文件中,配置SQLite数据库链接如下:
在上面的配置中,journal_mode: WAL 表示启用WAL模式。同时设置了超时时长、线程池的大小、锁类型
注意:不是所有的SQLite数据库连接库都支持journal_mode配置项,如果连接库不支持,可以手动在SQLite数据库文件中设置WAL模式。
扩展知识:
sqlit的journal_mode都有哪些模式?
SQLite的journal_mode有以下几种模式:
DELETE(默认模式):SQLite在写入日志数据到主数据库后,会删除日志文件(也就是删除-journal文件),这个过程有可能会导致数据丢失。
TRUNCATE:与DELETE模式相似,SQLite在写入日志数据到主数据库后,会删除日志文件,但是这个过程不会丢失数据。
PERSIST:SQLite在写入日志数据到主数据库后,会将日志数据保存在日志文件中,这个过程不会删除日志文件,并且可以通过日志文件恢复丢失的数据。
MEMORY:SQLite在写入日志数据到主数据库后,不会将日志存储到磁盘上,而是直接保存在内存中,这个过程可以提高写入性能,但是程序崩溃或者机器断电可能会导致数据丢失。
WAL(Write-Ahead Logging):SQLite通过WAL模式来提高写入性能,将日志数据写入到WAL文件中,而不是写入到主数据库中。WAL模式可以支持并发读取和写入操作,并且可以通过WAL文件来恢复丢失的数据。但是,WAL模式需要额外的磁盘空间来存储WAL文件,同时也需要支持WAL模式的SQLite版本。