天天看點

轉發 FMDB多線程下"is currently in use" 或者 "database is locked" 問題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://www.cnblogs.com/maojunjun/p/4963199.html