• FMDB的线程安全


    最近面试被问到FMDB的多线程处理问题,因为之前项目中是移植别人的代码,没有踩过这里的坑。

    问题:

    多线程同时访问数据库时,报数据库锁定的问题,错误信息是:

    Unknown error finalizing or resetting statement (5: database is locked)

    原因:

    文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写。在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译sqlite可以修改超时时间),就报"database is locked"错误。所以,在操作sqlite时,应该即时关闭连接;打开连接后,尽量减少非常费时的操作。

    解决:

    FMDatabase **不能多线程使用一个实例多线程访问数据库,不能使用同一个**FMDatabase 的实例。否则会发生异常。如果线程使用单独的FMDatabase 实例是允许的,但是同样有可能发生database is locked的问题。这是由于多线程对sqlite的竞争引起的.

    FMDatabaseQueue 解决这个问题的思路是:创建一个队列(串行线程队列),然后将放入的队列的block顺序执行,这样避免了多线程同时访问数据库

    解决方案 共享同一个FMDatabaseQueue**实例**

    注意:

    原本使用FMDatabase类,需要手工调用db的open和close方法,但是用FMDatabaseQueue,不需要调用open,因为查看代码发现,Queue已经open了。

    所以,使用Queue,是不需要自己打开和关闭db的。但是如果使用了FMResultSet,rs倒是需要关闭,否则会报warning:
    if ([db hasOpenResultSets]) {
    NSLog(@"Warning: there is at least one open result set around after performing [FMDatabaseQueue inDatabase:]");

    引申阅读

    加入GCD信号量控制

    Reference:

    IOS 使用FMDB多线程访问数据库 及databaseislocked的问题

  • 相关阅读:
    java中用spring实现数组类型输出
    #科委外文文献发现系统——导出word模板1.0
    #科委外文文献发现系统——项目管理
    终审项目展示
    M2事后会议报告
    【Beta版本发布】爬虫队长装备全面更新!
    Beta版本测试报告
    Beta阶段爬取数目预估
    团队作业Week14——源代码管理
    Daily Scrum NO.10
  • 原文地址:https://www.cnblogs.com/H7N9/p/6606964.html
Copyright © 2020-2023  润新知