Sqlite記憶體資料庫在多執行緒下的使用問題

2021-05-05 04:03:39 字數 2166 閱讀 3934

sqlite 記憶體資料庫的attach

我已經往記憶體資料庫a插入了10w條資料,我現在想把a匯入乙個物理檔案b(具有相同表結構),是不是應該用attach指令?有沒有高人詳細指點一下?

sqlite3_open(":memory:", &db);

...ret = sqlite3_exec(db, "create table new_table1 (id integer primary key autoincrement,name vchar(32))", 0, 0, &zerrmsg);

ret = sqlite3_exec(db,"begin transaction",0,0,&zerrmsg);

ret = sqlite3_exec(db, "insert into new_table1 (name) values ('123');", 0, 0,&zerrmsg);

ret = sqlite3_exec(db,"commit transaction",0,0,&zerrmsg);

到上面,資料庫已經插入記憶體資料庫了,然後再怎麼匯入物理檔案b?

sqlite3_open("c:/a.dat", &db);

ret = sqlite3_exec(db,"attach a.dat as new_db2",0,0,&zerrmsg);

ret = sqlite3_exec (db,"insert into new_db2.new_table2 (name) values('name')",0,0,&zerrmsg);

ret = sqlite3_exec(db,"detach new_db2",0,0,&zerrmsg);

if (ret!=sqlite_ok)

messagebox("附加資料庫失敗!");

這樣會提示"附加資料庫失敗!",不知道是那裡寫錯了...

搞反了,應該把檔案資料庫attach到記憶體資料庫中。sqlite3_open("c:/a.dat", &db);

這一句是多餘的,應該去掉。

ret = sqlite3_exec(db,"attach 'c:/a.dat' as new_db2",0,0,&zerrmsg);

這樣就可以從記憶體資料庫中複製資料到檔案資料庫中了,檔案資料庫中沒有表時使用(注意新錶沒有索引):

create table new_db2.new_table1 as select * from new_table1;

有表時使用:

insert into new_db2.new_table1 select * from new_table1;

已經搞定~

ret = sqlite3_exec(db,"attach 'c:/a.dat' as new_db",0,0,&zerrmsg);

ret = sqlite3_exec(db,"begin transaction",0,0,&zerrmsg);

ret = sqlite3_exec(db,"insert into new_db.new_table2 (name) select name from new_table1",0,0,&zerrmsg);

ret = sqlite3_exec(db,"commit transaction",0,0,&zerrmsg);

300萬條記憶體資料,10個字段,大概寫入了631mb物理檔案

並沒有多執行緒寫操作,a執行緒是不停讀,b執行緒是某一時候去寫/修改!

a先啟動,過段時間b才啟動,但是由於a執行緒是每20毫秒隨機從50萬條資料中讀一條資料,所以查詢間隔很快(20ms);此時b執行緒寫1萬條資料,然後隨機修改2萬條資料,b始終是成功的,但是在b操作的同時,a幾乎時候處於busy狀態,大部分查詢(20ms)都是返回busy狀態,偶爾能查詢出乙個值(估計是在b執行緒寫/修改某條資料成功,還未開始下條資料的寫/修改的空隙時),b執行緒寫/修改一完成,a執行緒馬上就正常了。

得到三點結論:

1、任何資料庫都有讀/寫互斥(鎖),oracle/sqlserver/mysql/sqlite...

2、完全可以修改sqlite源**,在thread讀寫有互斥的時候適當的sleep或者提示(新版的sqlite lib已經增加了sqlite3_busy_timeout、sqlite3_busy_handler功能)

3、當cpu運算能力超強時,一定會降低互斥的出現機率,但是互斥這種現象一定不會消失,因為互斥鎖的出現就是為了保證資料的完整性,remember!

Sqlite記憶體資料庫在多執行緒下的使用問題

windows平台,多執行緒伺服器,我想建立乙個全域性記憶體資料庫,然後在其他執行緒裡面使用這個庫,包括讀寫,弄的時候發現有幾個問題 1 方法一 程式啟動時建立乙個全域性sqlite連線,各個執行緒都可以操作這個例項。但經測試發現,這麼做,如果不做同步,讀寫都會衝突。也就是說,無論讀寫,只能有乙個執...

SQLite 記憶體資料庫學習手冊

一 記憶體資料庫 在sqlite中,資料庫通常是儲存在磁碟檔案中的。然而www.cppcns.com在有些情況下,我們可以讓資料庫始終駐留在記憶體中。最常用的一種方式是在呼叫sqlite3 open 的時候,www.cppcns.com資料庫檔名引數傳遞 memory 如 複製 如下 rc sqli...

SQLite記憶體資料庫簡單使用範例

include include include include sqlite3.h pragma comment lib,sqlite3.lib include include include codingconv.h int main int argc,char argv sql select f...