多執行緒運算元據庫

2021-06-20 11:37:50 字數 4143 閱讀 5079

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...