IOS中的Sqlite3并发问题

Posted

技术标签:

【中文标题】IOS中的Sqlite3并发问题【英文标题】:Sqlite3 Concurrency Issue in IOS 【发布时间】:2013-10-07 13:04:48 【问题描述】:

我在我的 ios 应用程序中使用 SQLite 3。它需要大量的读/写操作,其中许多是同时尝试的。这些函数中的大多数都在不同的线程中运行,但是访问的是同一个数据库。

以下是我想到的几种方法:

    在每次数据库访问(读/写)时,我都会设置一个标志为database_open=YES,如果发现是真的,我会在几秒钟后重试。我可以把函数放在数据库层本身。

    在同一线程中运行所有数据库操作。但是,我的用例是我需要等待一些 HTTP 调用完成并将检索到的数据存储到 SQLite 中。对于这种方法,我必须使所有这些服务器调用也同步。不是最好的主意。

如果我想错了方向,请提出建议。

【问题讨论】:

离题:你应该试试FMDB。 FMDB 是线程保存的,并且有一个非常简单的 SQL 语句接口 或者,更准确地说,您可以使用 FMDB 的FMDatabaseQueue,作为协调来自不同线程的数据库交互的机制,方法是拥有一个单独的串行队列,两个线程将调度任何数据库交互。即使您不使用 FMDB,您也可以使用这种模式来协调来自不同线程的数据库交互,拥有自己的串行队列,您可以将所有这些交互分派到该队列。 谢谢各位。这似乎解决了我的问题。我阅读了他们的 FMDatabaseQueue,它完全符合我的需要。 :) 【参考方案1】:

SQLitesupports concurrent access from multiple threads。只需配置 SQLITE_CONFIG_MULTITHREAD 模式,从每个线程单独打开数据库。

【讨论】:

以上是关于IOS中的Sqlite3并发问题的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite3插入性能测试

SQLite3的锁机制和并发控制详解

ios swift中的并发任务执行

SQLite3::BusyException

GCD 全局并发队列并不总是并发(iOS 设备)?

使用带有 ios 5 核心数据并发的 RestKit 时崩溃