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 | |
轉載于:https://www.cnblogs.com/maojunjun/p/4963199.html