fmdb使用注意問題:
1、匯入:導入庫 libsqlite3;
2、多執行緒運算元據庫---fmdatabasequeue
fmresultset *rs = [db executequery:sql,resourcename];
if ([rs next])
else
[rs close];
fmresultset 注意結果集的關閉;(單執行緒操作不關閉,沒問題,但是)多執行緒操作,必須注意,良好的程式設計習慣很重要;關於 db關閉,寫**的時候沒有寫,也沒報錯
3、測試結果
如果涉及到多執行緒運算元據庫 要點:乙個執行緒fmdatabase運算元據庫,同時 多個執行緒使用fmdatabasequeue運算元據庫是不允許的,必須全部使用fmdatabasequeue操作,(如果同時寫入一張標的話)否則,有些情況,會造成死鎖。
簡而言之:專案中,要麼只有乙個執行緒運算元據庫,只用fmdatabase;要麼多執行緒操作,全部使用fmdatabasequeue操作(fmdatabasequeue,這個類的原理,也是把讓多個執行緒的資料庫同步排隊操作)
測試過程:
- (void)writedbone
}}- (void)writedbtwo
}} 乙個執行緒操作fmdbdatabase,乙個執行緒操作fmdbdatabasequeue,測試結果:
2014-08-22 17:28:43.615 fmdbthreadtest[2153:3f03] db error: 5 "database is locked"
2014-08-22 17:28:43.617 fmdbthreadtest[2153:3f03] db query: select * from tbl_user
證明queue採用同步操作的**:
- (void)writedbone
}}- (void)writedbtwo
}}
2014-08-22 19:45:17.987 fmdbthreadtest[2449:3507]同步開始
2014-08-22 19:45:17.989 fmdbthreadtest[2449:3507] *****************sql--name 0--db
2014-08-22 19:45:17.999 fmdbthreadtest[2449:3507]同步完成
2014-08-22 19:45:18.001 fmdbthreadtest[2449:3507] writedbone 0
2014-08-22 19:45:18.001 fmdbthreadtest[2449:3c03]同步開始
2014-08-22 19:45:18.004 fmdbthreadtest[2449:3c03] *****************sql--name 600--db
2014-08-22 19:45:18.007 fmdbthreadtest[2449:3c03]同步完成
2014-08-22 19:45:18.007 fmdbthreadtest[2449:3c03] writedbtwo 600
2014-08-22 19:45:18.007 fmdbthreadtest[2449:4103]同步開始
2014-08-22 19:45:18.086 fmdbthreadtest[2449:4103]同步完成
2014-08-22 19:45:18.087 fmdbthreadtest[2449:3507]同步開始
2014-08-22 19:45:18.087 fmdbthreadtest[2449:3507] *****************sql--name 1--db
2014-08-22 19:45:18.089 fmdbthreadtest[2449:3507]同步完成
2014-08-22 19:45:18.090 fmdbthreadtest[2449:3507] writedbone 1
2014-08-22 19:45:18.090 fmdbthreadtest[2449:3c03]同步開始
2014-08-22 19:45:18.091 fmdbthreadtest[2449:3c03] *****************sql--name 601--db
2014-08-22 19:45:18.093 fmdbthreadtest[2449:3c03]同步完成
2014-08-22 19:45:18.097 fmdbthreadtest[2449:3c03] writedbtwo 601
2014-08-22 19:45:18.097 fmdbthreadtest[2449:3507]同步開始
2014-08-22 19:45:18.099 fmdbthreadtest[2449:3507] *****************sql--name 2--db
2014-08-22 19:45:18.101 fmdbthreadtest[2449:3507]同步完成
2014-08-22 19:45:18.102 fmdbthreadtest[2449:3507] writedbone 2
2014-08-22 19:45:18.103 fmdbthreadtest[2449:3c03]同步開始
2014-08-22 19:45:18.103 fmdbthreadtest[2449:3c03] *****************sql--name 602--db
2014-08-22 19:45:18.105 fmdbthreadtest[2449:3c03]同步完成
由列印結果可知,在乙個資料庫操作沒有執行之前,另外乙個資料庫操作是不會執行的。
4、不重要,但是也不太確定的經驗
每個執行緒分別操作自己的fmdatabase物件-----會導致資料庫死鎖
兩個執行緒操作乙個fmdatabase物件--in use
乙個執行緒操作多個fmdatabase物件--(不科學)但是平常使用都用單例物件 ---估計是出於記憶體原因考慮
補充關於操作佇列的認識:
根據cpu繁忙程度,自己分配執行緒,相同**任務,不一定是同乙個執行緒;
切記,也就是說如果操作到共有資源,注意只用同步鎖;否則報些資料庫 busy ,id not 唯一的錯,也是很煩人的。。。。
5、下面的情況需要使用同步鎖
-(void)downandwritepicturetolocalwithurl:(nsstring *)url
else
}[self.lock unlock];
}
上述**中,downandwritepicturetolocalwithurl方法,在分執行緒中執行且有多個物件例項呼叫該方法,雖然2步資料庫操作都在佇列中執行,但是不能確定哪一步先放入佇列,所以還是需要使用同步鎖 python 多執行緒運算元據庫
如果使用多執行緒運算元據庫,容易引起多使用者操作鎖表 operationalerror 2013,lost connection to mysql server during query 使用多執行緒時,出現鏈結伺服器消失的錯誤,在鏈結資料庫時,加入ping true 方法 1 conn mysql...
python多執行緒運算元據庫問題
python多執行緒併發運算元據庫,會存在鏈結資料庫超時 資料庫連線丟失 資料庫操作超時等問題。解決方法 使用資料庫連線池,並且每次操作都從資料庫連線池獲取資料庫操作控制代碼,操作完關閉連線返回資料庫連線池。連線資料庫需要設定charset utf8 use unicode true,不然會報中文亂...
多執行緒程式設計學習筆記 非同步運算元據庫
接上文 多執行緒程式設計學習筆記 使用非同步io 接上文 多執行緒程式設計學習筆記 編寫乙個非同步的http伺服器和客戶端 三 非同步運算元據庫 本示例演示了建立資料庫,非同步運算元據,讀取資料的過程。1.程式 如下。建立資料庫文.string createcommand string.format...