久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何理解SQLite軟件架構

171次閱讀
沒有評論

共計 2498 個字符,預計需要花費 7 分鐘才能閱讀完成。

本篇內容主要講解“如何理解 SQLite 軟件架構”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“如何理解 SQLite 軟件架構”吧!

SQLite 是一個非常受歡迎的數據庫,在數據庫排行榜中已經進入前十的行列。這主要是因為該數據庫非常小巧,而且可以支持 Linux、Windows、iOS 和 Andriod 的主流的操作系統。

SQLite 非常簡單,是一個進程內的動態庫數據庫。其最大的特點是可以支持不同的語言來使用,比如 C、C++、Java 等等。同時,SQLite 還是一個開源的數據庫,也就是開發者可以根據自己的需求來修改數據的功能特性。

SQLite 雖然非常小巧,但功能卻非常豐富,正所謂“麻雀雖小,五臟俱全”。SQLite 不僅具備基本的 SQL 特性,還具備索引、觸發器、視圖和事務等特性。

SQLite 的主要 API

SQLite 提供兩種訪問接口,一種是通過 sqlite 命令行工具,另外一種是通過動態庫,也就是 API 函數。在學習 SQLite 架構之前,我們有必要對其 API 進行一個簡要的介紹。其實 SQLite 的 API 很簡單,主要包括三個,分別是 sqlite3_open、sqlite3_exec 和 sqlite3_close 三個函數。其中 sqlite3_exec 則是用于執行 SQL 語句的函數。

也就是說 sqlite3_exec 是 SQLite 功能的關鍵入口,我們后面分析代碼也應該以此函數作為突破點。其它函數相對簡單,也沒那么重要。

SQLite 整體架構

首先我們從整體架構上介紹一下 SQLIte。其架構如圖所示,包括接口層、SQL 命令處理器和存儲后端等。

最為核心的不是就是 SQLite 內核了。其中包括接口層、SQL 命令處理器和虛擬機三部分。SQL 命令處理器負責對用戶的 SQL 進行預處理,最終生成適用于虛擬機執行的代碼。

其下是后端部分,后端部分相當于存儲引擎。下面我們簡要的介紹一下每個模塊的功能。

(1) 接口

SQLIte 庫的使用通過函數調用實現。為了避免與其它庫出現沖突,SQLite 的函數都以 sqlite3 作為前綴。接口部分的實現在文件 main.c,legacy.c 和 vdbeapi.c 中。其中 main.c 中包含其主要的接口,包括 sqlite3_open、sqlite3_config 和 sqlite3_close 等等。SQLite 中最終的函數不在 main.c 中,而是在 legacy.c 中,該文件中只包含這一個接口的實現。

(2) 詞法分析器

詞法分析器對 SQL 語句字符串進行解析,最終生成單詞 (token) 序列。并且將生成的單詞序列傳給解析器進行下一步的動作。該功能的具體實現在文件 tokenize.c 中,核心入口函數為 sqlite3RunParser。

(3) 解析器

SQLite 的解析器基于 Lemon 實現,它實現將 SQL 語句字符串解析成語法樹。Lemon 是一個與 YACC/BISON 類似的詞法分析庫。該庫的源代碼在 tool 目錄中。

(4) 代碼生成器

代碼生成器用于生成與 SQL 語句對應,可以在虛擬機執行的代碼。代碼生成器實現比較復雜,包含的文件有:build.c, delete.c, attach.c,  expr.c, insert.c, pragma.c, select.c,  auth.c 等等。通過文件名可以看出,這里很多文件其實分別對應著一個 SQL 語句,比如 delete,insert 和 select 等。

(5) 虛擬機

SQL 的具體執行在一個稱為虛擬機的組件中進行的,這個在前面架構圖中已經有所展示。虛擬機執行的代碼有前面代碼生成器產生。虛擬機的實現在文件 vdbe.h 和 vdbe.c 中。

(6) B- 樹

SQLite 的數據通過 B 樹進行組織管理。每個表或者索引都有一個對應的 B 樹。所有的 B 樹存儲在一個數據庫文件中。B 樹的具體實現在 btree.c 和 btree.h 文件中。

(7) 頁緩存

SQLite 的文件被劃分為等份大小,B 樹也是以該大小為粒度來對數據進行管理。頁緩存是該粒度對應的內存內容,通過該內存實現對數據塊的讀寫等訪問。頁緩存相關的實現在 pager.c 和 pcache.c 等文件中。

(8) 操作系統接口

SQLite 是一個跨平臺的數據庫,其存儲數據需要兼容 Windows 和 Linux 的文件系統 API。為了方便,SQLite 實現了一個抽象層。這樣對于 SQLite 業務邏輯來說,只需要調用該抽象層的接口即可,而不用關心操作系統。

(9) 基礎庫

包含一個被各個模塊都可能使用到的基礎庫,比如內存分配,字符串處理等。

SQLite 文件格式

前文我們簡要的介紹了一下 SQLite 的軟件架構以及每個組件的基本功能。接下來我們介紹一下數據庫文件的相關功能。

在 SQLite 中一個文件承載著一個數據庫實例,這個文件稱為主庫文件(main database  file)。除了主庫文件外,還可能有一些其它文件,比如用于事務的日志文件等。本文主要集中介紹主庫文件,其它文件后續介紹。

(1) 頁

數據庫文件由多個頁構成,每個頁的大小在 512 到 65536 字節之間,且大小必須是 2 的冪。頁通過編號進行標記,起始值為 1,最大編號為 2 的 31 次冪 -2。頁的默認大小是 4KB,本文以默認大小為例進行介紹。

在數據庫中的每個頁都有一個特定的用途,這些用途包括:

鎖字節頁(Lock-byte page)

剩余 頁

B 樹 頁

指針映射頁

有效負載溢出頁

數據庫文件的第一個頁是比較特殊的,它包含整個數據庫文件的描述信息,這里稱為數據庫頭信息。

(2) 數據庫頭

數據庫頭包含 100 個字節的內容,其中每一個成員的偏移,大小和功能如下圖所示。

我們可以創建一個數據庫實例,然后對照文件內容與數據庫頭的格式進行理解。比如數據庫頭的第一個成員為一個魔數,用于標識該文件為 SQLite 數據庫文件及版本。在下圖中可以找到該信息,可以看出兩者完全匹配(SQLite  format 3)。

除了上述數據庫頭的格式外,每個不同的頁都有不同的布局。

到此,相信大家對“如何理解 SQLite 軟件架構”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計2498字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 清流县| 明溪县| 安乡县| 冀州市| 曲阜市| 任丘市| 安徽省| 南宫市| 扶绥县| 义马市| 建宁县| 平远县| 迭部县| 钦州市| 沙坪坝区| 扎鲁特旗| 衡南县| 柞水县| 琼结县| 锡林浩特市| 厦门市| 泸定县| 常州市| 巴林右旗| 三江| 汉中市| 余江县| 敦化市| 株洲市| 宁武县| 乐清市| 儋州市| 东兴市| 阜康市| 阿拉善右旗| 弥勒县| 乌拉特中旗| 湖州市| 广南县| 德钦县| 天长市|