zoukankan      html  css  js  c++  java
  • iOS上Sqlite多线程问题

    1.单线程:禁用所有的mutex锁,并发使用时会出错。当SQLite编译时加了SQLITE_THREADSAFE=0参数,或者在初始化SQLite前调用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)时启用。
    2.多线程:只要一个数据库连接不被多个线程同时使用就是安全的。源码中是启用bCoreMutex,禁用bFullMutex。实际上就是禁用数据库连接和prepared statement(准备好的语句)上的锁,因此不能在多个线程中并发使用同一个数据库连接或prepared statement。当SQLite编译时加了SQLITE_THREADSAFE
    =2参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)启用;或者在创建数据库连接时,设置SQLITE_OPEN_NOMUTEX flag。
    3.串行:启用所有的锁,包括bCoreMutex和bFullMutex。因为数据库连接和prepared statement都已加锁,所以多线程使用这些对象时没法并发,也就变成串行了。当SQLite编译时加了SQLITE_THREADSAFE
    =1参数时默认启用。若SQLITE_THREADSAFE不为0,可以在初始化SQLite前,调用sqlite3_config(SQLITE_CONFIG_SERIALIZED)启用;或者在创建数据库连接时,设置SQLITE_OPEN_FULLMUTEX flag。

      在iOS上,默认使用的是第2种方式编译的,也就是只有一个线程能够打开数据库操作,其他线程要操作数据库必须等数据库关闭后才能打开操作。多线程时:每个线程独立打开数据库,操作数据库,操作完后关闭数据库。打开和关闭都比较费时间,而且要手动控制打开关闭锁,在每个线程操作不频率时可用该方法。

      如果多个线程频繁操作数据库,使用以上方法很容易造成系统崩溃,解决方案:开启第3种串行模式,使用一个类(单例方式)操作数据库。

    -(BOOL)open
    {
        sqlite3_shutdown();
        NSLog(@"sqlite3 lib version: %s", sqlite3_libversion());
        int err=sqlite3_config(SQLITE_CONFIG_SERIALIZED);
        if (err == SQLITE_OK) {
            NSLog(@"Can now use sqlite on multiple threads, using the same connection");
        } else {
            NSLog(@"setting sqlite thread safe mode to serialized failed!!! return code: %d", err);
        }
        err = sqlite3_open([VersionDBPath UTF8String], &hSqlite3DB);
        if(err != SQLITE_OK) {
            NSLog(@"datebase open error: %d", err);
            return NO;
        }
        return YES;
    }
  • 相关阅读:
    js -- 判断数组是否为空?
    vue 初始化高德地图
    git .gitignore 忽略规则的匹配语法
    vue 人脸识别 demo
    vue音乐app——VSCODE中设置vue文件模板
    vue音乐项目——解析stylus中的 &.router-link-active
    十月训练记录
    概率与期望 学习笔记
    山东省队集训整理
    APIO2020 简要题解
  • 原文地址:https://www.cnblogs.com/bandy/p/2811676.html
Copyright © 2011-2022 走看看