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 (@ "打开数据库失败!" ); } }]; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 个人数据保全计划:从印象笔记迁移到joplin
· Vue3.5常用特性整理
· 重拾 SSH:从基础到安全加固
· 为什么UNIX使用init进程启动其他进程?