前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >sqlite 超时时间设置 [database is locked]

sqlite 超时时间设置 [database is locked]

作者头像
jgrass
发布2024-12-25 16:40:57
发布2024-12-25 16:40:57
1290
举报
文章被收录于专栏:蔻丁杂记

sqlite数据库,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写。在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译sqlite可以修改超时时间),就报”database is locked”错误。

SQLiteException: database is locked异常的解决 - 简书

如何处理

1 默认 5 秒是很长的时间了,找出具体是哪些业务执行会造成超时 5 秒

beets: the SQLite lock timeout nightmare

2 调用方自己再加锁

SQLiteException: database is locked异常的解决 - 简书

3 修改 busy timeout 时间

这个只能是减少问题发生的概率,具体方法如下:

设置 busy timeout 的 API

sqlite 原始 API

Set A Busy Timeout

devart 库的 API

BusyTimeout Property

C# 版本

设置 CommandTimeout 即可,单位为秒。

Database errors - Microsoft.Data.Sqlite | Microsoft Docs

c# - Linq-to-SQL Timeout - Stack Overflow

c# - What is the “Default Timeout” value in SQLite connection string used for? - Database Administrators Stack Exchange

Timeout issue · Issue #1668 · linq2db/linq2db

其它参考

python - OperationalError: database is locked - Stack Overflow

漫谈 SQLite | 张不坏的博客

另一个思路

sqlite 超时时间设置 [database is locked] - J.晒太阳的猫 - 博客园

见留言:

最近正好也有遇到多线程写sqlite(写入期间不读),报这个错误,参考到这篇文章。 我一开始用的调用方加锁的方式,性能不太好。 我最终的解决方案是把不同线程所有需要写入的数据都统一插入到一个线程安全的集合里, 然后开个线程专门用来将集合数据写入sqlite。而且有个线程安全的集合当缓存,可以批量写入。性能要比调用方加锁好一点。

原文链接: https://cloud.tencent.com/developer/article/2481508

本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年4月2日 |,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何处理
  • 设置 busy timeout 的 API
    • sqlite 原始 API
    • devart 库的 API
    • C# 版本
  • 其它参考
  • 另一个思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档