SQLite多进程访问

2024-01-07

我们在多进程和多线程应用程序中使用 SQLite。 SQLite 数据库文件使用嵌入式 SQLite 加密进行加密。 这FAQ http://sqlite.org/faq.html#q5指出 SQLite 应该能够使用锁机制来管理多进程访问。 我们遇到一个奇怪的问题: 当许多线程访问同一个数据库文件时,有时会发生约束违规,更具体地说 - 具有唯一约束的字段在调用“插入或替换”语句后获取重复值。 现在经常发生我们正在使用加密的情况。在我们开始使用 SQLite 加密之前,我们没有注意到这种行为。 这有什么具体的已知问题吗?


虽然 SQLite 是“线程安全的”,但您仍然无法同时修改数据库:

然后每个线程继续插入一个 记录数,假设为 1000。 你会遇到的问题是 如下:一个线程将获得控制权 通过设置锁定来访问数据库 文件。这很好,但其余的 线程将继续失败 对于每次尝试插入,而 锁处于活动状态。 (参考 http://www.sqlite.org/cvstrac/wiki?p=MultiThreading)

一次只允许一个线程修改数据库,但可以有多个线程attempt修改数据库。

如果你想避免锁定时失败的问题,你可以检查 SQLITE_BUSY 标志:

测试 SQLITE_BUSY,我没有测试 原来做。这是一些伪代码 来说明一个解决方案:

  while (continueTrying) {
    retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
    switch (retval) {
      case SQLITE_BUSY:
        Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
        sleep a bit... (use something like sleep(), for example)
        break;
      case SQLITE_OK:
        continueTrying = NO; // We're done
        break;
      default:
        Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
        continueTrying = NO;
        break;
    }
  }

  return retval;

相同的参考 http://www.sqlite.org/cvstrac/wiki?p=MultiThreading

我敢打赌,您的约束违规与多线程无关,所以您能否发布您收到的实际约束违规(或符合www.sscce.org http://www.sscce.org).

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

SQLite多进程访问 的相关文章

随机推荐

  • 更新 WPF Desktop Bridge Universal 应用程序时无法升级设置

    我的应用程序是用 WPF C 编写的 我直接从 Visual Studio 使用 MSIX 应用程序项目将其导出为通用应用程序 我只是无法让设置在更新之间保持不变 我在中使用以下代码MainWindow Loaded event Setti
  • 为什么 AngularJS 应用程序中的空白被忽略

    AngularJS 应用 ng model 指令将输入字段绑定到控制器属性 在我的应用程序中 带空格的输入将被忽略 例如 A 结果输出是 A 有没有办法也包含这些空白 Fiddled here http jsfiddle net pa6sd
  • 确保 Web 服务安全

    我正在完成我的 iPhone 应用程序 我只是担心我们的网络服务器级别的安全性 数据通过网络服务被转移到 iPhone 应用程序 我可以在 Web 服务上采取哪些安全措施 以免受到攻击 Thanks 一些提示 使用以下命令验证来自 Web
  • 在 OSX 中拦截键盘输入

    我正在尝试编写一个应用程序来防止某些关键信号传播到 OSX 中的操作系统之外 为了澄清这一点 我想让用户感觉他们在键盘上按的键似乎坏了 因此 关联的字母不会显示在文本区域中 按键不会激活另一个应用程序中的功能 等等 有什么想法吗 提前致谢
  • 使用 SQL 查询打印素数的最佳逻辑 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 MongoDB MySQL CockroachDB 中通过 SQL 获取 2 到 1000 素数的最有效方法是什么 我在Oracle中的查询
  • TXMLDocument 的替代方案?

    最近 我们将代码从 Delphi 2009 升级到 Delphi XE 并更新了我们的 Indy 组件 不确定这是否相关 但从那时起 我们在 Windows Server 2003 计算机上加载和保存 XML 文件时就会出现错误 XMLDo
  • 你可以有多个 UnityAppController 的子类吗?

    我需要添加一些代码application didFinishLaunchingWithOptions in UnityAppController使用其 Objective C SDK 配置 Google AdWords 转化跟踪 每次 Un
  • Objective C JAVA 字节序

    我使用的是 64 位 Mac 并且我确信 Java 在我的例子中是 1 6 正在使用 big endian 我正在尝试从 Objective C 中的 iPhone 与我的 java 服务器进行通信 iPhone objective C 使
  • 在我的 Android 项目中使用领域数据库时无法生成 GlideApp 和 Glide 请求

    我使用 Glide 来处理图像 到目前为止它运行良好 但是现在 当我将 Realm 数据库集成到我的项目中时 它在生成 GlideApp 和 GlideRequests 类时出现错误 主要构建 gradle buildscript repo
  • GIF 图像在“document.location.href”时停止

    我在 javascript 中有这个函数 function loadPage url showLoadPageGif visibility On document location href getPath url 当我使用此功能时 GIF
  • 如何从 Knex / Postgresql 查询返回纯值?

    我正在尝试使用 Knex 从 Postgres DB 返回一个简单的标量字符串值 到目前为止 我所做的一切都会返回一个带有键 列名 和值的 JSON 对象 因此我必须访问该对象才能获取值 如果我返回多行 那么我会得到多个 JSON 对象 每
  • Python 动态属性和 mypy

    我试图将一些函数屏蔽为属性 通过包装器 这在这里并不重要 并将它们动态添加到对象中 但是 我需要代码完成和 mypy 才能工作 我想出了如何动态添加属性 通过元类或简单地在构造函数中 但我遇到的问题是 mypy 没有选择它 IDE 也没有
  • 如何从android将值传递到php?

    我在将值从 android 传递到 php 脚本时遇到问题 我想要questionid传递到 php 脚本url get ansurl但我无法传递该值 这个怎么做 请指导我 多谢 try int success json getInt TA
  • 自定义 UIAlertView 上的按钮

    这是我自定义按钮的当前方式 UIAlertView av UIAlertView alloc init av addButtonWithTitle UIButton yesButton av subviews lastObject av s
  • 使用 htaccess 将网站重定向到移动版网站

    您好 我使用以下代码重定向到移动网站 从移动到移动网站 移动中的domain com到m domain com 它工作正常 但网址末尾的 id 9 即将到来 如何删除 id 9 从 url 以及如何将移动网站 m domain com 从桌
  • Android 视图转换是否在光栅化后应用?

    下面代码中的行 A 和行 B 应生成相同的图像 然而 行 A 却生成了图像 怎么了 光栅化后是否应用视图 画布转换 import android content Context import android graphics Canvas
  • express.js - 单行中多个路由的单个路由处理程序

    有没有办法在单个函数调用中做到这一点 var todo function req res app get todo app get blabla todo app get blablablabla todo 就像是 app get blab
  • Google 联系 gdata (Java) 因内容类型没有解析器而失败:application-xml[application/xml]

    最近 两天前 当我们尝试访问联系人时 我们开始在 Java 中的 google gdata 客户端中遇到异常 提要 m8 feeds contacts default full 例外的是 com google gdata util Pars
  • 如何使用 Gmail Api 获取邮件列表?

    我想访问消息列表 Object 2 0 0 p481 008 gt g gmail api users messages list gt lt Google APIClient Method 0x41c948c ID gmail users
  • SQLite多进程访问

    我们在多进程和多线程应用程序中使用 SQLite SQLite 数据库文件使用嵌入式 SQLite 加密进行加密 这FAQ http sqlite org faq html q5指出 SQLite 应该能够使用锁机制来管理多进程访问 我们遇