• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • sqlite3提升執行速度——事務操作

    標簽: 數據庫操作  sqlite3  數據庫  c語言

    數據庫在執行多條操作時就會顯得速度很慢,為了提升速度可以使用數據庫的事務操作來提升速度
    一、事務介紹

    	事務(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,可以編譯運行
    下載地址

    版權聲明:本文為afootball原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/afootball/article/details/108240904

    智能推薦

    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 數據庫插入...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡