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 被称为可重入错误的主要内容,如果未能解决你的问题,请参考以下文章