我正在使用 FMDB 访问标准的 iOS 内部 SQLite 数据库,在多个线程之间共享一个 db 连接。
为了使其线程安全,我一次将对数据库的访问锁定为一个代码块。一切都很好,尽管显然现在对数据库的访问有点瓶颈。
我的问题是:只要它们都是只读的 SELECT 语句,我可以通过允许来自多个线程的同时查询来缓解这个问题吗?
我在任何地方都找不到答案。
我正在使用 FMDB 访问标准的 iOS 内部 SQLite 数据库,在多个线程之间共享一个 db 连接。
为了使其线程安全,我一次将对数据库的访问锁定为一个代码块。一切都很好,尽管显然现在对数据库的访问有点瓶颈。
我的问题是:只要它们都是只读的 SELECT 语句,我可以通过允许来自多个线程的同时查询来缓解这个问题吗?
我在任何地方都找不到答案。
您不能使用同一连接同时执行多个查询。
但是,对于纯只读访问,您可以使用多个连接。
每个线程可以有一个FMDatabase
对象。您可能必须编写代码来测试真正的繁忙情况并正确处理它们。例如设置busyRetryTimeout
适合您的情况(例如,您希望它在争用情况下重试多长时间)。如果超时到期并且您的数据库查询失败,也可以优雅地处理。
显然,使用共享FMDatabaseQueue
是从多个线程进行数据库交互的最简单方法。请参阅 FMDB 的使用 FMDatabaseQueue 和线程安全部分README
。