zoukankan      html  css  js  c++  java
  • 转发 FMDB多线程下"is currently in use" 或者 "database is locked" 问题

    FMDB多线程下"is currently in use" 或者 "database is locked" 问题

    问题一: "is currently in use" 出现的场景是这样的,多线程操作数据库,每个线程都使用了FMDatabase实例(注意没有使用FMDatabaseQueue)。

    问题二:“database is locked"出现的场景是这样的,多线程操作数据库,每个线程各自创建了FMDatabaseQueue实例操作数据库,或者一个线程创建 FMDatabaseQueue实例来操作,而另外的线程创建了FMDatabase实例来操作。

    解决:FMDB多线程操作数据库,必须使用FMDatabaseQueue,必须只创建一个实例,也就是多个线程操作数据库的是同一个FMDatabaseQueue实例。

    原因:因为首先FMDatabase是不具备线程安全的,如果两个线程中同时操作数据库,就会"is currently in use" ;FMDatabasequeue其实是一个调度队列(G-C-D),数据库的操作必须是顺序执行,不能两个数据库的操作同时执行,如果是两个线程各自创 建了FMDatabaseQueue的实例,线程同时执行时,就会出现相同的数据库操作同时触发,导致”database is locked“,所以必须是一个FMDatabaseQueue实例下,多个线程下同时操作,其实是在排在同一个队列中逐一操作的,没有同时操作。

    PS:以下就是我的解决方式

    复制代码
     1 #pragma mark - 配置数据库单聊
     2 +(FMDatabaseQueue *)getSharedDatabaseQueue
     3 {
     4     static FMDatabaseQueue *my_FMDatabaseQueue=nil;
     5     
     6     if (!my_FMDatabaseQueue) {
     7         NSString *path = [kDocuments stringByAppendingPathComponent:@"db_CMBCC.sqlite"];
     8         my_FMDatabaseQueue = [FMDatabaseQueue databaseQueueWithPath:path];
     9     }
    10     return my_FMDatabaseQueue;
    11 }
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    - (void)SaveSingleChatMessage:(MessageEntityModel *)messageEntity
    {
        FMDatabaseQueue *queue = [StoreManagerHelper getSharedDatabaseQueue];
        [queue inDatabase:^(FMDatabase *db) {
        //打开数据库
        if ([db open]) {
     
          //数据库建表,插入语句  
        
        }
            else
            {
                NSLog(@"打开数据库失败!");
            }
     
        }];
    }
  • 相关阅读:
    https进行配置以及http跳转到https配置
    centos7修改系统语言为简体中文
    iptables snat 和dnat说明
    python多线程执行类中的静态方法
    python 磁盘空间操作
    python logging 工具
    python 动态调用函数
    python 读写XML
    js加载json数据成表格
    python 比较两个数据库postgresql
  • 原文地址:https://www.cnblogs.com/maojunjun/p/4963199.html
Copyright © 2011-2022 走看看