博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转发 FMDB多线程下"is currently in use" 或者 "database is locked" 问题
阅读量:5052 次
发布时间:2019-06-12

本文共 1284 字,大约阅读时间需要 4 分钟。

问题一: "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://www.cnblogs.com/maojunjun/p/4963199.html

你可能感兴趣的文章
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
Swift 中的指针使用
查看>>
Swift - 使用闭包筛选过滤数据元素
查看>>
alue of type java.lang.String cannot be converted to JSONObject
查看>>
搜索引擎选择: Elasticsearch与Solr
查看>>
JAVA设计模式之简单工厂模式与工厂方法模式
查看>>
③面向对象程序设计——封装
查看>>
【19】AngularJS 应用
查看>>
Spring
查看>>
Linux 系统的/var目录
查看>>
Redis学习---Redis操作之其他操作
查看>>
WebService中的DataSet序列化使用
查看>>
BZOJ 1200 木梳
查看>>
【Linux】【C语言】菜鸟学习日志(一) 一步一步学习在Linxu下测试程序的运行时间...
查看>>
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
mysql 多表管理修改
查看>>