sqlite3提升執行速度——事務操作
數據庫在執行多條操作時就會顯得速度很慢,為了提升速度可以使用數據庫的事務操作來提升速度
一、事務介紹
事務(Transaction)是一個對數據庫執行工作單元。事務(Transaction)是以邏輯順序完成的工作單位或序列,可以是由用戶手動操作
完成,也可以是由某種數據庫程序自動完成。
例如:在一張表中插入一條數據,刪除數據,修改數據,查找數據,都是在執行事務。實際上可以把一些相同操作的事務歸并在一起,最后
一起提交就可以變成一個事務,大大提高了數據庫執行的效率。
1.事務操作分類
1."begin transaction" // 開始一個事務
2."commit transaction"// 提交事務
3."rollback transaction"//事務回滾,重新執行未提交的事務
2.在執行多次sql操作時可以以下面模板去使用事務
char *err_msg;
int ret;
ret=sqlite3_exec(db,"begin;",0,0,&err_msg);//開始一個事務
for(){
if(出錯){
sqlite3_exec ( db , "rollback transaction", 0 , 0 ,&exec_err);//事務回滾
}
}
sqlite3_finalize(stmt);
sqlite3_exec(db,"commit;",0,0,&exec_err);//提交事務
3.demon驗證
1>下面demon使用事務插入1000條信息到表中,用時14毫秒
void sql_class_insert(int age,const char *name,const char *sex)
{
int res, err = -1;
char *exec_err;
sqlite3_stmt *stmt;
//1.執行sql select語句
res = sqlite3_prepare_v2(db, INSERT_class, -1, &stmt, NULL);
if (SQLITE_OK != res) {
goto out;
}
int i;
sqlite3_exec(db,"begin;",0,0,0);
struct timeval start_time;
struct timeval stop_time;
gettimeofday(&start_time, NULL);
for(i=0;i<1000;i++){
sqlite3_reset(stmt);
//2.綁定數據 int類型
res = sqlite3_bind_int(stmt, 1, age);
if (res != SQLITE_OK)
{
err = -1;
}
//2.綁定數據 字符型
//SQLITE_STATIC->傳遞給該字符串的指針將有效,直到執行查詢為止
res = sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
if (res != SQLITE_OK)
{
err = -1;
}
res = sqlite3_bind_text(stmt, 3, sex, -1, SQLITE_STATIC);
if (res != SQLITE_OK)
{
err = -1;
}
//3.遍歷select執行的返回結果
res = sqlite3_step(stmt);
if (SQLITE_DONE == res) {
err = 0;
}
if(err==-1)
{
sqlite3_exec ( db , "rollback transaction", 0 , 0 ,&exec_err);
}
}
//4.銷毀前面被sqlite3_prepare創建的準備語句
//【每個準備語句都必須使用這個函數去銷毀以防止內存泄露】
sqlite3_finalize(stmt);
sqlite3_exec(db,"commit;",0,0,0);
gettimeofday(&stop_time, NULL);
printf("pay time is %ld毫秒\n",(stop_time.tv_sec * 1000 + stop_time.tv_usec / 1000)
- (start_time.tv_sec * 1000 + start_time.tv_usec / 1000));
out:
if (err < 0) {
printf("%s\n", sqlite3_errmsg(db));
printf( "res = %d\n", res);
}
}
2>j接下來屏蔽掉事務操作
對比發現屏蔽掉事務后插入速度明顯下降
數據庫
完整demon,可以編譯運行
下載地址
智能推薦
sqlite3數據庫的基本操作
SQLite 的數據庫權限只依賴于文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器。 它需要的內存,其它開銷很小,適合用于嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。 接口由SQLite C API組成,也就是說不管是程序、腳本語言還是庫文件,最終都是通過它與SQLite交互的(我們通常用得較多的ODBC/JDBC最后也會轉化為相應C API的調用)。 SQLi...
sqlite3數據庫操作大全
命令行操作 簡單的說些常用命令 之前我們已經對sqlite源碼進行了編譯,生成一個.exe文件 打開這個文件可以進入windows下的sqlite命令行操作界面 輸入下面兩行命令(命令都是以 .XXXX形式 ,語句都以 XXXXX; 形式) .open 打開demo.db數據庫,如果不存在則創建數據庫 .databases 查看當前已經打開的數據庫信息 .exi...
Sqlite3 C/C++ API 操作
參考文獻:https://www.runoob.com/sqlite/sqlite-tutorial.html Sqlite 語句在shell是可以執行的,本文是對sqlite語句在C/C++程序中執行的說明。 操作步驟: 數據庫打開->SQL語句執行->CallBack函數處理執行結果->數據庫關閉 數據庫打開 數據庫打開...
iOS sqlite3數據庫操作
一、前言 sqlite3數據庫是一種輕量型的數據庫,系統中已經默認安裝了,可以通過終端來查看: 首先進入模擬器的沙盒目錄中,我們在Documents目錄下創建一個sql文件,然后使用sqlite3來訪問這個文件。在終端中,可 以使用s...
27.Qt操作sqlite3數據庫
1 sqlite3操作編程 問題1 驅動無法加載 解決辦法將Qt自帶安裝目錄下的sql文件拷貝到可執行文件目錄下。 2 連接數據庫 3 查詢數據庫 4 數據庫插入...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...