sqlite并发问题

2024-02-19

我正在开发一个使用 sqlite 数据库的 iPhone 应用程序。该应用程序在后台线程中从 Internet 下载数据,而 UI 在主线程中。后台下载线程可以对数据库执行INSERT、UPDATE和SELECT。 UI 层还可以通过执行 UPDATE 和 SELECT 与数据库交互。如果我在后台线程下载时不与 UI 进行大量交互,则一切正常。但是,当下载过程中在主(UI)线程上执行大量更新时,我开始遇到问题。

当应用程序尝试运行数据库功能时,它总是退出。它以 EXC_BAD_ACCESS 退出,我没有看到任何错误。例如,上次退出时在 sqlite3_step 处结束:

    sqlite3_stmt *statement;
const char *query = "INSERT OR IGNORE INTO `names` (`id`,`name`) VALUES (?,?);";
if(sqlite3_prepare_v2(database, query, -1, &statement, NULL) != SQLITE_OK){
    NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database));
    return NO;
}
sqlite3_bind_int(statement, 1, id);
sqlite3_bind_text(statement, 2, name, -1, SQLITE_TRANSIENT);

if(sqlite3_step(statement) != SQLITE_DONE)
    NSAssert1(0, @"Error while inserting. '%s'", sqlite3_errmsg(database));

sqlite3_finalize(statement);

它并不总是在 sqlite3_step 上退出,有时它会在 sqlite3_prepare_v2 或 sqlite3_exec 上退出。我尝试将这些语句放入循环中,如果未返回 OK,则重试,但这也不起作用:

int returnCode = 0;
do{
    returnCode = sqlite3_step(statement);
    if(returnCode != SQLITE_DONE){
        usleep(20);
    }
}while(returnCode != SQLITE_DONE);

我也尝试过 SQL 事务,但这没有任何区别。我该如何解决这个问题?这似乎是一个相当基本的并发问题,但我还没有看到任何对我有用的东西。

感谢大家的帮助, 贾斯汀


除非您使用特殊设置重新编译它,否则 SQLite 不是线程安全的。

See http://www.sqlite.org/faq.html#q6 http://www.sqlite.org/faq.html#q6

因此,您需要负责访问数据库并从同一线程调用 SQL 操作。

然而,我想出了一个解决方案,即使在多线程环境中也似乎没问题:我确保任何 SQLite 操作都受到保护@synchronized指令以确保一旦线程在数据库上执行某些操作,任何其他线程都将被阻止访问它。

因此,与其说“所有 SQlite 操作应该在同一个线程中完成”,我宁愿说“确保两个操作不会在不同线程中并行执行”。

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

sqlite并发问题 的相关文章

  • 扁平化/反规范化 SQL 查找表的最佳方法?

    我有很多这样的表 Lookup HealthCheckupRisks ID Name 1 Anemia 2 Anorexic 3 Bulemic 4 Depression 122 Syphilis PatientRisksOnCheckup
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • SQL中如何合并多个表的数据

    我想我的处境很复杂 这是场景 我在 SQL Server 中有 3 个表 注册 学生 课程 仅供参考 没有外键 表的列是 Student 学生号 学生名 Course 课程 ID 课程名称 注册 注册 ID 学生 ID 课程 ID 课程结果
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 使用全文搜索查找精确匹配

    使用 Sql Server 2008 如何使用全文搜索来实际找到精确的字符串匹配 我对此感到非常困难 而且我在网上找不到令人满意的解决方案 例如 如果我正在搜索字符串 Bojan Skrchevski 我希望第一个结果正是如此 到目前为止
  • 如何查询多个链接服务器?

    链接一些 SQL Server 2008 服务器 实例后 我想对这些服务器进行更通用的查询 我知道我必须像这样指定查询的命运 select from SRV INSTANCE dbname dbo foo 但是 我会针对多个链接服务器运行此
  • Azure COSMOS DB 如何查询数组中的内容

    如何进行查询以获取文档数组 roles 中包含某些内容的文档 我想获取以下文档 其中 Trainer 是数组中的元素 enabled true profilePicture null roles Trainer Client SELECT
  • 多个连接到同一个表

    我有这组表格和数据 CREATE TABLE item id INT PRIMARY KEY name VARCHAR CREATE TABLE property id INT PRIMARY KEY name VARCHAR CREATE
  • 使用 SqlDataReader.IsDBNull 时使用列名

    我已经得到了从 SQL DB 读取数据的代码 我不知道应该如何编辑它 以便我可以使用原始列名称而不是列索引 string query SELECT FROM zajezd WHERE event thisrow AND year klien
  • 基于 JavaScript 的 iPhone UI 框架

    我们有一个基于推送的网络应用程序 最近 我们计划为其制作一个 iPhone 应用程序 就像 Facebook 拥有 iPhone 应用程序和网站一样 我们正在寻找一个可以让我们快速前进的 UI 框架 我翻阅过PhoneGap http ww
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何从 UILabel 创建图像?

    我目前正在 iPhone 上开发一个简单的类似 Photoshop 的应用程序 当我想要展平图层时 标签位于良好的位置 但字体大小不佳 这是我要展平的代码 UIGraphicsBeginImageContext CGSizeMake wid
  • 锁定 SQLite 数据库以从 C# 读取

    我的项目有一个 C dll 其中在 Sqllite 中创建一个数据库 共享拒绝 无 这个 dll 会将数据插入到数据库中 我有一个 C exe 它必须访问数据库并显示它 显示需要异步完成 在启动与 sqlitedb 的连接时 有什么方法可以
  • 如何使自定义绘制的 UITableViewCell 正确调整大小?

    出于性能原因 我在自定义视图中绘制 UITableViewCell 的字符串 该视图重写其 drawRect 方法 以使用 NSString drawInRect 直接在视图矩形中绘制字符串 这类似于 Apple 的 TableViewSu
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • 比较 Objective C 中的 NSNumber

    我是 Objective C 的初学者 对这种情况有点困惑 我有以下代码 if number1 lt number2 NSLog THE FOLLOWING NUMBER NSLog number1 NSLog IS LESS THAN N
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑

随机推荐

  • Rails paths.rb 语法

    我搜索了又搜索 但找不到详细说明 Rails 3 中的routes rb 语法的页面 有指南 概述 甚至高级示例 但为什么没有一个页面详细说明每个关键字的确切语法 这一页 http www engineyard com blog 2010
  • 在 C# 中引发事件的单元测试(按顺序)

    我有一些代码会引发PropertyChanged事件 我希望能够对事件是否正确引发进行单元测试 引发事件的代码就像 public class MyClass INotifyPropertyChanged public event Prope
  • C++ 中通过常量引用将指针传递给对象

    我正在为大学做一项实际作业 但遇到了一个问题 我有一个声明此方法的类 bool graficarTablero const Tablero tablero const string nombreArchivo 我想通过常量引用传递指向对象
  • IF a == true OR b == true 语句

    我找不到让 TWIG 解释以下条件语句的方法 if a true or b true do stuff endif 我错过了什么还是不可能的 检查这个树枝参考 https github com vito chyrp wiki Twig Re
  • 仍然出现“无法获取连接工厂客户端”错误

    04 01 10 17 20 701 E MapActivity 377 无法获取连接工厂客户端 我得到的只是灰色瓷砖 并且地图未加载 嘿 我认识的每个人都有很多类似的帖子 我彻底浏览了它们 它可以是互联网权限 我在应用程序标签之前添加了该
  • 为什么它被称为成员初始化器

    引用自办公室 Swift 文档 https developer apple com library ios documentation Swift Conceptual Swift Programming Language ClassesA
  • Service Worker 注册失败

    我目前正在研究服务人员来处理浏览器中的推送通知 目前我遇到了 软件注册失败错误 软件注册失败 出现错误 SecurityError 无法注册 ServiceWorker 不支持当前源 null 的 URL 协议 Check client1
  • 当我的本地存储库上只有项目的子目录时,是否可以在 Git 上推送?

    我有一个本地 git 存储库 配置为通过 Gitlab 上的 SSH 远程连接 我们称之为 email protected cdn cgi l email protection myrepo myproject git 在克隆存储库后 我喜
  • 我的 VS code 打开时总是崩溃

    I have tried uninstalling and reinstalling it but the problem did not dissappear It seems that when I open the app more
  • SmartAssembly 的异常处理和报告替代方案?

    我对用于异常处理的 SmartAssembly 解决方案感到满意 但我报告了一个问题红门论坛 http www red gate com messageboard viewtopic php t 12642并且尚未解决 SA 有哪些替代方案
  • 如何使用 Jest 测试事件监听器中的异步函数?

    我有一个运行异步函数的事件监听器 并在完成后从 DOM 中删除一些元素 async function fetchAndRemove try const response await fetch endpoint that returns j
  • 如何永久重命名 Docker 容器?

    我使用 docker compose 为 Laravel 应用程序构建 PHP 8 Nginx 我使用 docker compse up 成功启动它 docker ps给我以下输出 CONTAINER ID IMAGE COMMAND NA
  • Java - 如何将 CSV 文件反序列化为 JavaBean

    我想将 CSV 文件中的 java 对象解析为 XML 字符串 例如 我得到这样的 csv 所有列都是可选的 name age class level jon 12 archer 12 然后我想将其解析为 XML 输出如下 例如我不需要级别
  • 为什么 valgrind 在我的“测试”程序中没有检测到内存泄漏? [复制]

    这个问题在这里已经有答案了 整个测试代码包含在main cpp中 如下 include
  • 如何使用 Angular CLI 排除 lint 中目录下的所有文件?

    我们可以通过这种方式排除node modules lint project src main webapp app file json exclude node modules 但如何排除一个目录下的所有文件呢 我尝试了下面的方法 它不工作
  • 在java中获取数百万条记录[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 非常开放的问题 我需要编写一个 Java 客户端 从 Oracle 数据库读取数百万条记录 比方说帐户信息 将其转储为 XML 并通过
  • 更新流星模板后运行函数

    我有一个流星模板渲染一些我需要执行 jquery 函数的 html 现在 我已经设置了一个依赖项 以便每次与该模板关联的数据 对象列表 发生更改时 该函数都会运行 我完全不确定这是做我想做的事情的最佳方法 但每次我添加 删除 重新排列对象时
  • Sublime Text 2 添加插件模块 (MySQLdb)

    我正在为 Sublime Text 2 开发一个小插件 但我需要使用 MySQLdb 模块 MySQLdb 模块在我的普通 CLI 中运行良好 但 SB2 使用自己的 Python 版本 任何想法how我可以安装 MySQKdb 模块并且w
  • 如何通过单击返回表格单元格的行索引和列索引

    请参阅fiddle http jsfiddle net 8hnmw8j1 当我单击单元格时 我可以获得值和列名 我想知道如何获取行索引和列索引 以下是js代码
  • sqlite并发问题

    我正在开发一个使用 sqlite 数据库的 iPhone 应用程序 该应用程序在后台线程中从 Internet 下载数据 而 UI 在主线程中 后台下载线程可以对数据库执行INSERT UPDATE和SELECT UI 层还可以通过执行 U