解决SQLite中的 database is locked

2023-05-16

前些时候,同事在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked ,database is locked,而且这个是在客户生产环境下提示出来的,开发环境很难重现,同事实在没辙,竟然想发动所有研发同事通过操作软件重现问题,我只能呵呵了。既然是Sqlite的原因,直接写个小程序测试下sqlite不就行了,而且就算重现了,难不成要改Sqlite源码...

  Sqlite的特点:

  1. 简单(simple):SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS:一个头文件,一个动态库文件,你就拥有了关系数据库的所有功能了。简单,是SQLite最明显的哲学。它提供的API少而简单。只需要一个DLL文件,你的程序马上就拥有了一个功能强大的数据库引擎,这是一件很美妙的事。
  2. 小巧(small):我用VS 2005在Windows下编译的3.6.11,Release版为368K,用时不到20秒——而编译MySQL时,要花上几分钟。而当我插入10000条int数据时,内存开销660K,磁盘开销92K。
  3. 事务(transaction):事务是现代商业数据处理系统最基本的要求,而Access,不论是在可执行文件大小(看了一下Access2003的可执行文件大小为6.32M,两者不是一个量级),还是事务特性,都是不能和SQLite 相比的。
  4. 并发性(Concurrency):由于SQLite通过OS的文件锁来实现库级锁,粒度很大,但是,它通过一些复杂特殊的处理(具体可以参见分析系列),尽量的提升了读写的并发度。
  5. SQL92:SQLite支持绝大部分的标准SQL语句,你只需要几百K的空间,就可以换来需要上百兆的通用DBMS几乎所有操作了。
  6. 方便(Convenience):如果你的程序要使用SQLite,只需要将拷贝你的程序目录即可。
  7. 开源(Opensource):这是它最强大的地方。开源,意味着你可以品读它的源码,你可以随时修改它,加入你自己的特性,而这一切完全免费的。开源,是一种精神

  SQLite只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也就是说,即事务T1在A表插入一条数据,事务T2在B表中插入一条数据,这两个操作不能同时进行,即使你的机器有100个CPU,也无法同时进行,而只能顺序进行。表级都不能并行,更别说元组级了——这就是库级锁。但是,SQLite尽量延迟申请X锁,直到数据块真正写盘时才申请X锁,这是非常巧妙而有效的。

  上面的介绍可以看出Sqlite其实是一个客户端嵌入数据库,在高并发的服务器上是无法适用的,同事百度后,发现连接串中加入 "Journal Mode=WAL;"可以缓解并发压力,可是客户生产环境仍然出现“database is locked”错误。

我们可以编写一个测试案例,代码很简单的,并发的执行多条update语句,使用不同的机子,一般选择一个性能好点的机子(我测试的时候使用的是G4)和一个性能差点的机子(G2)

测试发现,在G2机器上,跑了不到半分钟,大概执行了500条Update语句,Sqlite就报错,提示“database is locked”,但是在G4机器上很难发现,这也就解释了开发机上难重现而在客户服务器上报错的现象。

这里要仔细看一下上面标注红色的内容,因为我刚开始没有使用任何同步机制来进行操作的,使用的G4手机测试的,结果一运行就报错,所以上网查询原因,结果说是对一个表进行操作的时候,需要进行加锁,所以我就在对同一个表进行CRUD操作的时候,使用了同一个锁,运行没有错,但是过了几天之后,测试那边的人给一个bug表,尽然出现了上面的问题,而且是G2机器,所以我就用这个机器进行测试,果然发现会出现上述的问题,这时候就很纠结了,网上各种搜索,无果,结果看到一篇文章说到了重点,说sqlite是库级锁,那么我就将上面的表级锁改成了库级锁(很简单,不同的表都是用同一个锁),在测试发现没有上述问题了。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决SQLite中的 database is locked 的相关文章

  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 如何确保与 sqlite 和 NFS 的文件安全同步

    我最近将应用程序的工作区文件格式转换为 sqlite 为了确保 NFS 上的稳健操作 我使用了通用更新策略 对本地硬盘上临时位置中存储的副本进行了所有修改 仅在保存时 我才会通过使用临时文件复制原始文件来修改原始文件 可能在 NFS 上 我
  • 拉拉维尔; “SQLSTATE[HY000] [2002] 连接被拒绝”

    我在 OSX 主机上设置了 homestead 2 0 并使用 Sequel Pro 我可以进行迁移并确认数据已在Sequel Pro中迁移 因此看起来数据库连接没有问题 但是 一旦我尝试从 Laravel 4 2 应用程序获取数据 它就无
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 如何在 PostgreSQL 中使用条件和子查询创建唯一索引?

    我使用 PGSQL 并尝试添加下面的索引 CREATE UNIQUE INDEX fk client ON user client fk client WHERE fk client NOT IN SELECT fk client FROM
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 使用 nw-gyp 构建 node-sqlite3

    我正在尝试为 node webkit 构建 sqlite3 The sqlite3 https www npmjs com package sqlite3 installing页面解释说它需要使用 nw gyp 来完成 据我了解 我应该下载
  • 如何使用 SQL 通过表示多级订单的 varchar 字段正确排序?

    我不太喜欢数据库 我发现在查询上出现以下问题SQL服务器数据库旧的遗留应用程序的 我声明不幸的是我无法更改数据库结构 字段类型 这非常难看 我有以下情况 SELECT Sottocategoria IdSottocategoria IdCa
  • 如何在文件系统中存储图像

    目前 我已将图像 最大 6MB 作为 BLOB 存储在 InnoDB 表中 随着数据大小的增长 夜间备份变得越来越慢 阻碍了正常性能 因此 二进制数据需要进入文件系统 指向文件的指针将保存在数据库中 数据具有树状关系 main site u
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 在android中创建SQLite数据库

    我想在我的应用程序中创建一个 SQLite 数据库 其中包含三个表 我将向表中添加数据并稍后使用它们 但我喜欢保留数据库 就好像第一次安装应用程序时它会检查数据库是否存在 如果存在则更新它 否则如果不存在则创建一个新数据库 此外 我正在制作
  • dbms_xmlgen.getxml - 如何设置日期格式

    我们使用 dbms xmlgen getxml 实用程序通过 SQL 查询生成 xml 该查询从几乎 10 15 个相关表中获取数据 默认情况下 日期格式生成于dd MMM yy格式 有什么方法可以在 dbms xmlgen getxml
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g
  • 巩固 Django 南迁移

    在我的项目的初始阶段 我对模型进行了很多更改 因此我最终为我的应用程序生成了很多向南迁移 在转到我的生产服务器执行迁移之前 是否可以以任何方式整合它们 这样我就不会为每个应用程序进行一百万次迁移 如果是这样 我该怎么做呢 您始终可以删除现有
  • Entity Framework 7 和 SQLite 表未创建

    我已经尝试了一段时间来弄清楚如何使用单个 DBContext 以 Code First 方式创建多个表 但没有任何运气 我确信这只是我对框架的不熟悉 但我不确定我错过了什么 这是一个包含实体和 DBContext 的简单示例 Table M
  • SQLite 仅当值不为空时更新列

    Query UPDATE item table SET field1 field1 spanish field2 field2 spanish 问题 我怎样才能更新field1 with field1 spanish ONLY if fie

随机推荐

  • 测试Java反射效率

    测试分为3个方面 xff1a 1 实例化效率 xff1b 2 方法调用效率 xff1b 3 成员变量GET调用效率 xff1b 4 成员变量SET调用 测试环境 xff1a Windows 7 Sun Java 1 6 先写好备测试用的类
  • google reader给我带了了什么

    题记 xff1a 这篇文章是自己的有感而发 xff0c 更是写给一个特别的朋友 xff0c 希望google reader xff08 以下简称GR xff09 带给我的东西也同样可以传递给你 xff0c 传递给每个人 引文 xff1a 已
  • 终于尘埃落定,准备踏上新的旅程

    经过一个月的纠结 xff0c 等待 xff0c 谈判 xff0c 奔波 xff0c 终于今天一切都定下来了 xff0c 即将离开 xff0c 有太多太多已经告别了的和即将告别的 xff0c 有些来不及 xff0c 有些舍不得 xff0c 但
  • shortcuts in Firefox on MacOSX

    以下是firefox菜单里看不到的 xff0c 看得到就自己看看吧 xff0c 不在这里总结了 home page gt opt 43 fn 43 left 因为fn 43 left gt home left tab gt 1 ctr 43
  • 火狐扩展开发:在第三方页面插入JS脚本

    第一步 xff0c 首先在xul文件内引入执行插入脚本的JS文件 xff0c 例如 xff1a 第二步 xff0c 向第三方插入脚本的代码 xff1a var ffCreate 61 init function var appcontent
  • 多式样ProgressBar

    多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程 xff0c 例如发送短信 xff0c 连接网络等等 xff0c 表示一个过程正在执行中 一般只要在XML布局中定义就可以了 lt progr
  • 修改Linux系統的默認連接數

    1 修改用戶進程可打開文件數限制 在Linux平台上 xff0c 無論編寫客戶端程序還是服務端程序 xff0c 在進行高並發TCP連接處理時 xff0c 最高的並發數量都要受到系統對用戶單一進程同時可打開文件數量的限制 這是因為系統為每個T
  • 详解大端模式和小端模式

    详解大端模式和小端模式 一 大端模式和小端模式的起源 关于大端小端名词的由来 xff0c 有一个有趣的故事 xff0c 来自于Jonathan Swift的 格利佛游记 xff1a Lilliput和Blefuscu这两个强国在过去的36个
  • 字符串连接(c语言实现)

    起因 今天九度刷题的时候 xff0c 发现一个不调用任何c的库函数实现字符串拼接的代码很多人写的过于复杂 xff0c 链表都用上了 xff0c 真的不至于 xff0c 只要知道字符串的最后截止符是 39 0 39 题目描述 xff1a 不借
  • STL里list、vector、queue性能差异与疑似内存泄漏问题

    最近在项目中debug退出后 xff0c VS的Output面板会输出大量内存泄漏的信息 经过排查 xff0c 居然发现是使用了std list的原因 xff01 然而通过MSDN上一些前辈的讨论 xff0c 得知List并没有真正导致内存
  • malloc/free 的使用要点

    函数malloc的原型如下 xff1a void malloc size t size 用malloc申请一块长度为length的整数类型的内存 xff0c 程序如下 xff1a int p 61 int malloc sizeof int
  • 游戏中用户点击不可达地点引起寻路循环,游戏停顿问题解决

    游戏中用户点击不可达地点引起寻路循环 xff0c 游戏停顿问题解决 通常我们在游戏中通过寻路算法来找到用户点击的地点 xff0c 再根据目标地点来进行寻路 当用户点击 一个不可到达的地点时候 xff0c 游戏会出现突然停顿现象 如上图中的X
  • Android 驱动和系统开发 2. 解析模拟器GPS模块 (原创)

    好久没有写技术博客了 xff0c 恰逢今天还感冒了 xff0c 这破天气 xff0c 晚上凉风一吹 xff0c 就感冒了 xff0c 要加强锻炼呀 好了 xff0c 废话不多说 xff0c 由于工作需要 xff0c 我要移植一个虚拟的gps
  • QoS的基本原理

    QoS的基本原理 作者 xff1a 上传时间 xff1a 2011 04 22 关键字 xff1a 网络大爬虫4 QoS专题 文 胡国华 1 前言 QoS xff08 Quality of Service xff09 是服务质量的简称 对于
  • Java 两个数相除,只要有小数就入一位,不舍去,即为向上去整

    向上取整用Math ceil double a 向下取整用Math floor double a 例如 xff1a System out println Math ceil 1 21 System out println Math ceil
  • NAT的双机热备方案

    一般的NAT组网中 xff0c 内网用户通过单台设备进行NAT转换访问外网 xff0c NAT设备承担了所有内外网之间的流量 xff0c 无法规避单点故障 一旦发生单点故障 xff0c 将导致内网用户无法与外网通信 随着用户对网络可靠性的要
  • 《Java TCP/IP Socket 编程 》读书笔记之十二:各章节要点

    转载请注明出处 xff1a http blog csdn net ns code article details 16118955 T CP IPSocketsinjava读书笔记 第1章 xff1a 简介 1 协议相当于相互通信的程序间达
  • 给同校大一IT新生的建议

    在论坛上看到同学院的学弟问的 xff0c 就回答了一下 打的字挺多的 xff0c 所以就发到博客上了 原文是这样子的 xff1a 我上大一 xff0c 西安二本里垫底的大学 在学校C语言学一学期感觉啥也没学到 想补补自己的编程技术 xff0
  • mysql 让空值用0补充的函数IFNULL(a,0)

    记录 xff0c 防止遗忘 xff01 sql如下 xff1a SELECT IFNULL SELECT sum EO using value FROM cq energy other as eo WHERE eo EO type 61 e
  • 解决SQLite中的 database is locked

    前些时候 xff0c 同事在站点服务端使用SQlite存储一些临时数据 xff0c 但是在多人并发的时候Sqlite会抛出异常 xff1a The database file is locked database is locked xff