SQLite3使用總結備忘(多執行緒/WAL/鎖等)
阿新 • • 發佈:2019-02-08
1、多執行緒下使用 rc = sqlite3_open_v2(DBFILENAME, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, NULL);
4、避免鎖定衝突可使用官方busy handler或者timeout方法,或者使用do...while...等待鎖完成(相當於自己重寫busy handler)
2、多執行緒開啟WAL模式:rc = sqlite3_exec(db, "PRAGMA journal_mode=WAL;", callback, 0, &zErrMsg);
3、WAL模式開啟後db檔案拷貝和覆蓋都無法操作,因此若需要檔案操作,則必須使用DELETE模式
if(strcmp(mode,"DELETE")==0) { rc = sqlite3_exec(db, "PRAGMA journal_mode=DELETE;", callback, 0, &zErrMsg); if (rc != SQLITE_OK) { printf("set DELETE failed!: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } else{ rc = sqlite3_exec(db, "PRAGMA journal_mode=WAL;", callback, 0, &zErrMsg); if (rc != SQLITE_OK) { printf("set WAL failed!: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_wal_checkpoint(db, NULL);
4、避免鎖定衝突可使用官方busy handler或者timeout方法,或者使用do...while...等待鎖完成(相當於自己重寫busy handler)
5、如果必須利用查詢的結果來處理外部操作的時候,C++必須使用Vector,迅速將查詢結果置入Vector中馬上sqlite3_finalize(pStmt);再遍歷Vector來處理相應外部操作,一方面大大降低了衝突的可能性,另一方面也便於處理結果。
6、對同時要操作多條exec,必須使用事務,大大加快執行速度
7、必須對每個資料表定義Index操作,大大加快執行速度
8、多執行緒使用全域性控制代碼時,必須建立pthread_mutex_t。除非可以保證多執行緒之間執行資料庫prepare_v2操作時不衝突。否則,當一個執行緒prepare_v2分配好pStmt正在操作時,另一個執行緒sqlite3_finalize(pStmt),那麼就會出現異常,導致整個程式down掉。但不知道為何,卻不列印任何的ERROR_CODE。
9、使用sqlite3_exec結束後不用做sqlite3_finalize