SQLite

安裝前端

sudo apt-get install sqlite3 sql

sudo apt-get install libsqlite3-dev數據庫

 

運行後端

gcc main.c -lsqlite3緩存

 

SQLite API服務器

SQLite是一個嵌在程序中的調用級的接口庫。用C語言實現了全部的API函數。全部的API函數名的前綴爲sqlite3_,其在sqlite3.h中聲明。還有常量助記符也在.h中聲明。網絡

SQLite源文件和應用程序都應該用相同的編譯器編譯多線程

sqlite3_open()打開或者建立數據庫。調用其餘API以前必須先用這個函數。此函數比較偷懶,直到讀寫文件時纔會被真正執行。併發

sqlite3_prepare()把SQL語句轉化爲「預備語句」(或者說是字節碼文件),在虛擬機或者解釋器上運行。這個準備語句句柄的做用像一個遊標,用於獲取由select語句返回所獲得的行的集合,每次處理一個。函數

sqlite3_step()執行字節碼程序,直到一個斷點(返回SQLITE_ROW),或者直到中止(返回SQLITE_DONE)。最初遊標在全部應輸出的行的集合以前,此函數使得遊標每次向前移動一個位置,並且遊標只能向後移動。

sqlite3_column_*()是檢索sqlite3_step()函數所返回的SQLITE_ROW,能夠見所各列的值(屬性或字段)。

sqlite3_finalize()破壞準備語句(即清除字節碼程序),全部的準備語句必須被釋放以防止內存泄露。

sqlite3_close()關閉數據庫鏈接,並釋放全部分配給鏈接的資源。

sqlite3_bind_*()是把SQL中的字符串用SQL參數標記來代替?

sqlite3_reset()貌似是把原先的準備語句換成空的準備語句?

 

全部API返回0或正整數。SQLite建議用助記符檢查返回值。

SQLITE_OK表示成功。

SQLITE_ROW表示sqlite_step返回了行的集合中的一個新的行。

SQLITE_DONE表示該語句執行完畢。

 

還有另外一種直接操做數據庫的方式:打開數據庫文件,應用sqlite3_exec API函數,最後關閉數據庫文件。此API有兩個參數(數據庫文件名,SQL語句)。若是語句產生輸出,則exec()函數應該爲每個行調用回調函數。讀者應該具備對文件的讀權限,視狀況要有寫權限。

每一個線程都應該有本身的SQLite句柄,不建議共享。在UNIX,LINUX中不該在持有一個鏈接時fork出一個子進程。多線程共享一個鏈接是能夠的,當一個線程不持有該鏈接上的任何本地文件鎖時,可把鏈接切換到下一個線程。即沒有鎖,沒有未完成事務(或者被重置或者被完成)。總之線程在相互排斥的狀況下是能夠共用一個鏈接的。

master catalog 是主目錄能夠查詢 select * from sqlite_master,可是不能修改master catalog,全部內部保留的都是以sqlite_開頭的,不能以這個前綴(大寫,小寫,大小寫混合)建(表,視圖,索引,觸發器)。

SQLite以一個單一的本地文件存儲整個數據庫,這個文件也能夠被放在本地的任何其餘目錄下。

SQLite的attach命令用於同時訪問多個數據庫的事務處理。

 

SQLIte體系結構

前端接收從應用程序來的SQL語句和SQLite命令,解析,優化,生成後臺能夠直接執行的內部字節碼程序

標記生成器:分割輸入語句爲標記。

解析器:分析標記生成解析樹,重組解析樹。

代碼生成器:遍歷解析樹,生成字節碼。

在前端實現sqlite3_prepare()。

後端是解釋字節碼程序的引擎,該引擎負責實際的數據庫處理工做。

虛擬機:是內部字節碼程序的解釋器,執行字節碼。操做數據庫中的數據,把數據庫視爲表和索引的集合,把表和索引視爲元組或記錄的集合。

B/B+樹:把每一個元組組織成有序的樹形結構。表和索引在不一樣的樹中。負責幫助虛擬機搜索,增長,刪除在樹中的元組,也負責創建新樹,刪除舊樹。

頁操做模塊:在本地文件系統基礎上實現面向頁的數據庫文件的抽象。管理內存中的緩存(數據庫頁,B/B+樹用)。管理鎖和日誌來實現事務的ACID特性。

操做系統界面:爲不一樣的系統提供統一的接口。

在後端實現sqlite3_bind_*(),sqlite3_step(),sqlite3_column_*(),sqlite3_reset(),sqlite3_finalize()等API。

 

SQLite侷限性

未支持所有SQL-92功能。

低併發:只支持扁平事務[不能嵌套事務(子事務),保存點(容許事務回滾到之前已經穩定的狀態)]。也不能支持高度的事務的併發,容許併發讀事務,只容許一個獨佔的的寫事務。即有讀事務,其餘寫事務都禁止;有寫事務,其餘任何事務都禁止。SQLite只提供數據庫級的併發事務處理,及前面提到的都是數據庫級獨佔。

應用限制:SQLite只適合於小規模事務併發。可是有些應用,尤爲是寫密集型的,須要更多的事務併發(表級或行級),SQLite並不適合。

網絡文件系統:SQLite使用本地文件的鎖原語控制事務的併發性。可是若是數據庫文件在其餘網絡中,因爲網絡文件系統的文件鎖的實現的bug,可能會致使多個程序去修改數據庫,SQLite對此無解。因爲網絡延遲使得網絡文件系統性能很差,可能客戶-服務器模型的DBMS會比SQLite更有效。

數據庫規模:理論上數據庫文件可達241字節。可是日誌的內存開銷與數據庫大小成正比。對於每一個寫事務,SQLite都要對內存中的每一個頁面維護1位,不管事物是否讀寫該頁面。所以若是有上百萬頁的話,內存開銷多是SQLite最嚴重的瓶頸。

對象的數目和類型:一個表或者索引最多有264-1個條目(這是不可能的,由於內存纔有241字節)。目前SQLite實現了單個條目可保存230字節數據(底層文件格式支持單行262字節數據)。在打開一個數據庫文件時,SQLite讀取並預處理全部主目錄的條目,並在內存中建立許多目錄對象。爲了保持性能,最好保持表,索引,視圖,觸發器的數目在一個較低水平。雖然表中列的數目沒有限制,也不要太多,只可能會對前31列作某些優化。也能夠隨意把不少列加到一個索引上,可是有30列以上的索引是不會被用做查詢優化的。

主機變量引用:在某些其餘嵌入式DBMS中,SQL語句能夠直接引用主機變量(來自程序空間的變量),可是SQLite不能。SQLite綁定主機輸入參數用sqlite3_bind_*()API函數,但不能綁定到輸出參數。這方法比直接訪問要好,由於直接訪問還須要再把SQL語句進行特殊預處理轉換成特殊的API調用。

存儲過程:許多別的DBMS能夠建立和保存存儲過程,但SQLite沒有。存儲過程是一組可造成一個邏輯工做單元或執行特定功能的SQL語句的集合。

相關文章
相關標籤/搜索