Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否有必要为SELECT语句同时锁定SQLite访问?_Ios_Multithreading_Sqlite - Fatal编程技术网

Ios 是否有必要为SELECT语句同时锁定SQLite访问?

Ios 是否有必要为SELECT语句同时锁定SQLite访问?,ios,multithreading,sqlite,Ios,Multithreading,Sqlite,我使用FMDB访问标准iOS内部SQLite数据库,多个线程共享一个db连接 为了保证线程安全,我将对数据库的访问一次锁定为一块代码。尽管访问数据库现在显然有点瓶颈,但一切都很好 我的问题是:我是否可以通过允许来自多个线程的同时查询来缓解这个问题,只要它们都是只读SELECT语句 我在任何地方都找不到答案。不能使用同一个连接同时执行多个查询 但是,对于纯只读访问,可以使用多个连接。每个线程可以有一个FMDatabase对象。您可能需要编写代码来测试真正繁忙的情况,并正确地处理它们。例如,设置适合

我使用FMDB访问标准iOS内部SQLite数据库,多个线程共享一个db连接

为了保证线程安全,我将对数据库的访问一次锁定为一块代码。尽管访问数据库现在显然有点瓶颈,但一切都很好

我的问题是:我是否可以通过允许来自多个线程的同时查询来缓解这个问题,只要它们都是只读SELECT语句


我在任何地方都找不到答案。

不能使用同一个连接同时执行多个查询


但是,对于纯只读访问,可以使用多个连接。

每个线程可以有一个
FMDatabase
对象。您可能需要编写代码来测试真正繁忙的情况,并正确地处理它们。例如,设置适合您的情况的
busyRetryTimeout
(例如,您希望它在争用情况下重试多长时间)。如果超时过期并且数据库查询失败,也可以正常处理


显然,使用共享的
FMDatabaseQueue
是从多个线程进行数据库交互的最简单方法。请参阅FMDB
自述文件

的部分。文档不清楚,但我认为FMDatabaseQueue不会同时执行多个只读查询。“对吗?”斯蒂芬说得对
FMDatabaseQueue
是一个“串行”队列,这意味着它确保查询不会同时进行。这是从多个队列与数据库交互的最安全、最简单的方法。但是,如果您希望它们可能同时运行,那么可以为不同的队列创建单独的
FMDatabase
对象,但只需确保妥善处理“数据库繁忙”超时。您可以通过配置
SQLITE\u THREADSAFE
,允许多个线程使用同一连接,但是这是通过一个简单的互斥来实现的,所以你不会得到任何并发性。我只是刚刚在我的代码中测试了这一点,因此接受较晚,但这正是我需要的答案。