FMDatabaseQueue 被称为可重入错误

Posted

技术标签:

【中文标题】FMDatabaseQueue 被称为可重入错误【英文标题】:FMDatabaseQueue was called reentrantly error 【发布时间】:2018-02-14 04:07:56 【问题描述】:

我的 sqlite 数据库有一个包装器,它创建对象并处理所有数据库查询。它仅包含 SELECT 查询。它被很好地分解为可重复使用的部分并且运行良好。

最近我添加了一个运行缓慢的查询(多个连接),所以我想在后台队列上运行它。

我创建了一个 FMDatabaseQueue 并将我对 db.executeQuery 的所有调用封装在 queue.inDatabase db in ... 中。

但是当 FMDB 检测到我在另一个 inDatabase 呼叫中呼叫 inDatabase 时,它会爆炸:

inDatabase: was called reentrantly on the same queue, which would lead to a deadlock.

处理这个问题的正确方法是什么?看来我需要重构我的代码以确保永远不会有对 db 的嵌套调用,但我不明白为什么,因为 sqlite 在同时读取方面没有问题。

【问题讨论】:

【参考方案1】:

FMDatabaseQueue 无法检测您是否要进行更新或启动事务,或者您是否只进行读取。所以它总是对可重入调用说“不”。

如果您只进行读取,则可以改为使用连接池。

【讨论】:

谢谢,不知道 FMDatabasePool!

以上是关于FMDatabaseQueue 被称为可重入错误的主要内容,如果未能解决你的问题,请参考以下文章

函数可重入性及编写规范

可重入函数

可重入概念

可重入函数

函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

ReentrantLock实现原理-何为可重入