開放源碼嵌入式資料庫 SQLite 簡介

來源:互聯網
上載者:User

開放源碼嵌入式資料庫 SQLite 簡介

Nils-Erik Frantzell , 電腦科學系, University of California, Santa Cruz

2005 年 8 月 22 日

自幾十年前出現的商務應用程式以來,資料庫就成為軟體應用程式的主要組成部分。正與資料庫管理系統非常關鍵一樣,它們也變得非常龐大,並佔用了相當多的系統資源,增加了管理的複雜性。隨著軟體應用程式逐漸模組模組化,一種新型資料庫會比大型複雜的傳統資料庫管理系統更適應。嵌入式資料庫直接在應用程式進程中運行,提供了零配置(zero-configuration)運行模式,並且資源佔用非常少。本文將介紹流行的 SQLite 資料庫引擎,並描述如何在應用程式開發中使用它。

SQLite 是 D. Richard Hipp 用 C 語言編寫的開源嵌入式資料庫引擎。它是完全獨立的,不具有外部依賴性。它是作為 PHP V4.3 中的一個選項引入的,構建在 PHP V5 中。SQLite 支援多數 SQL92 標準,可以在所有主要的作業系統上運行,並且支援大多數電腦語言。SQLite 還非常健壯。其建立者保守地估計 SQLite 可以處理每天負擔多達 100,00 次點擊率的 Web 網站,並且 SQLite 有時候可以處理 10 倍於上述數位負載。

功能

SQLite 對 SQL92 標準的支援包括索引、限制、觸發和查看。SQLite 不支援外鍵限制,但支援原子的、一致的、獨立和持久 (ACID) 的事務(後面會提供有關 ACID 的更多資訊)。

為什麼要進行嵌入?

嵌入式資料庫的名稱來自其獨特的運行模式。這種資料庫嵌入到了應用程式進程中,消除了與客戶機伺服器配置相關的開銷。嵌入式資料庫實際上是輕量級的,在運行時,它們需要較少的記憶體。它們是使用精簡代碼編寫的,對於嵌入式裝置,其速度更快,效果更理想。嵌入式運行模式允許嵌入式資料庫通過 SQL 來輕鬆管理應用程式資料,而不依靠原始的文字檔。嵌入式資料庫還提供零配置運行模式,這樣可以啟用其中一個並運行一個快照。

要知道,SQLite 的資料庫許可權只依賴於檔案系統,沒有使用者帳戶的概念。SQLite 有資料庫級鎖定,沒有網路伺服器,並且可以實現多數 SQL92 標準(但不是全部)。SQL92 標準的其他一些主要功能是外鍵和檢查限制。瞭解哪些 SQL92 功能未實現。

這意味著事務是原子的,因為它們要麼完全執行,要麼根本不執行。事務也是一致的,因為在不一致的狀態中,該資料庫從未被保留。事務還是獨立的,所以,如果在同一時間在同一資料庫上有兩個執行操作的事務,那麼這兩個事務是互不干擾的。而且事務是持久性的,所以,該資料庫能夠在崩潰和斷電時倖免於難,不會遺失資料或損壞。

SQLite 通過資料庫級上的獨佔性和共用鎖定定來實現獨立交易處理。這意味著當多個進程和線程可以在同一時間從同一資料庫讀取資料,但只有一個可以寫入資料。在某個進程或線程向資料庫執行寫入操作之前,必須獲得獨佔鎖定。在發出獨佔鎖定後,其他的讀或寫操作將不會再發生。

SQLite 網站上記錄了完整的 SQLite locking semantics。

回頁首

內部結構

在內部,SQLite 由以下幾個組件組成:SQL 編譯器、核心、後端以及附件。SQLite 通過利用虛擬機器和虛擬資料庫引擎(VDBE),使調試、修改和擴充 SQLite 的核心變得更加方便。所有 SQL 陳述式都被編譯成易讀的、可以在 SQLite 虛擬機器中執行的程式集。

圖 1. SQLite 的內部結構

SQLite 支援大小高達 2 TB 的資料庫,每個資料庫完全儲存在單個磁碟檔案中。這些磁碟檔案可以在不同位元組順序的電腦之間移動。這些資料以 B+樹(B+tree)資料結構的形式儲存在磁碟上。SQLite 根據該檔案系統獲得其資料庫許可權。

資料類型

SQLite 不支援待用資料類型,而是使用列關係。這意味著它的資料類型不具有表列屬性,而具有資料本身的屬性。當某個值插入資料庫時,SQLite 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成列類型。如果不能轉換,則該值將作為其本身具有的類型儲存。

SQLite 支援 NULLINTEGERREALTEXTBLOB 資料類型。

回頁首

管理 SQLite

SQLite 附帶一個可下載的 command-line interface for database administration。通過資料庫名稱可以調用此命令列程式,並且可以按照下面的方式建立新的資料庫和表:

清單 1. 建立新的資料庫和表

C:/minblogg>sqlite3 c:/minblogg/www/db/alf.dbSQLite version 3.2.1Enter ".help" for instructionssqlite> create table mytable(name varchar(40), age smallint);sqlite> insert into mytable values('Nils-Erik',23);sqlite> select * from mytable;Nils-Erik|23sqlite>

然後,可以再次開啟該資料庫,列出它的表和架構,並繼續進行插入和刪除值的操作。

清單 2. 列出表和架構

C:/minblogg>sqlite3 c:/minblogg/www/db/alf.dbSQLite version 3.2.1Enter ".help" for instructionssqlite> .tablesmytablesqlite> select * from mytable;Nils-Erik|23sqlite> .schemaCREATE TABLE mytable(name varchar(40), age smallint);sqlite>

SQLite 還附帶命令列資料庫分析器,該分析器允許您顯示關於任何 SQLite 資料庫目前狀態的詳細資料。

清單 3. SQLite 分析器

C:/minblogg>sqlite3_analyzer www/db/alf.dbAnalyzing table mytable...Analyzing table sqlite_master.../** Disk-Space Utilization Report For www/db/alf.db*** As of 2005-Apr-24 18:56:40Page size in bytes.................... 1024Pages in the whole file (measured).... 2Pages in the whole file (calculated).. 2Pages that store data................. 2          100.0%Pages on the freelist (per header).... 0            0.0%Pages on the freelist (calculated).... 0            0.0%Pages of auto-vacuum overhead......... 0            0.0%Number of tables in the database...... 2Number of indices..................... 0Number of named indices............... 0Automatically generated indices....... 0Size of the file in bytes............. 2048Bytes of user payload stored.......... 13           0.63%*** Page counts for all tables with their indices ********************MYTABLE............................... 1           50.0%SQLITE_MASTER......................... 1           50.0%*** All tables *******************************************************Percentage of total database.......... 100.0%Number of entries..................... 2Bytes of storage consumed............. 2048Bytes of payload...................... 91           4.4%Average payload per entry............. 45.50Average unused bytes per entry........ 916.50Maximum payload per entry............. 78Entries that use overflow............. 0            0.0%Primary pages used.................... 2Overflow pages used................... 0Total pages used...................... 2Unused bytes on primary pages......... 1833        89.5%Unused bytes on overflow pages........ 0Unused bytes on all pages............. 1833        89.5%*** Table MYTABLE ****************************************************Percentage of total database..........  50.0%Number of entries..................... 1Bytes of storage consumed............. 1024Bytes of payload...................... 13           1.3%Average payload per entry............. 13.00Average unused bytes per entry........ 999.00Maximum payload per entry............. 13Entries that use overflow............. 0            0.0%Primary pages used.................... 1Overflow pages used................... 0Total pages used...................... 1Unused bytes on primary pages......... 999         97.6%Unused bytes on overflow pages........ 0Unused bytes on all pages............. 999         97.6%

由於完全能夠使用命令列介面來管理資料庫,因此它可以為資料庫管理員帶來很大的方便。目前有許多優秀的基於 Web 的 SQLite 資料庫管理系統。其中有一個是基於 PHP 的 SQLiteManager。

圖 2. 使用 SQLiteManager 管理資料庫

回頁首

備份

備份 SQLite 資料庫有兩種方法。如果資料庫正在使用中,則應從命令列介面使用 .dump 命令。這樣可以建立一個包含必要命令和資料的檔案,從而重新建立資料庫。.dump 命令也可以用於備份資料庫表。

清單 4. .dump 命令

sqlite> .dumpBEGIN TRANSACTION;CREATE TABLE mytable(name varchar(40), age smallint);INSERT INTO "mytable" VALUES('Nils-Erik', 23);COMMIT;sqlite>

如果資料庫沒有處於使用狀態,則可以直接將資料庫檔案複製到安全位元置。

回頁首

在 PHP V5 中使用 SQLite

一個好的做法是將 SQLite 資料庫與 PHP 代碼分開。完成此操作的一個簡便方法是建立一個 www 目錄。在此目錄中,建立一個用於存放 SQLite 資料庫的 db 目錄、一個用於存放資料庫和表建立指令碼的 dbscripts 目錄和一個用於存放Database Backup的 backups 目錄。

清單 5. 使用 PHP V5 組織 SQLite 資料庫

2004-12-06  15:43    DIR          .2004-12-06  15:43    DIR          ..2005-04-23  19:55    DIR          db2005-01-02  11:46    DIR          dbscripts2005-01-02  11:46    DIR          backups

在 PHP V5 中建立 SQLite 資料庫與在命令列介面中建立該資料庫非常相似。如果該資料庫不存在,則建立一個空資料庫。

$db = sqlite_open('../db/ac.db');

建立一個表也非常容易:

清單 6. 建立表

$db = sqlite_open('../db/ac.db');sqlite_query($db, 'DROP TABLE post');sqlite_query($db, 'CREATE TABLE post (id INTEGER PRIMARY KEY, kategori VARCHAR(20) NOT NULL, titel VARCHAR(75) NOT NULL, referens VARCHAR(75), status VARCHAR(20) not null, date varchar(10)not null, synopsis VARCHAR(120), inlaegg varchar(8192))');

插入一條記錄:

$sqldb = sqlite_open("../db/ac.db");sqlite_query($sqldb, "INSERT INTO isvs VALUES ('$isvurl' , '$isvname', '$comment')");

並選擇資料:

清單 7. 從 SQLite 資料庫中選擇資料

$sqldb = sqlite_open("www/db/ac.db");$results = sqlite_query($sqldb, "SELECT * FROM isvs order by isvurl asc ");   while (list($isvurl, $isvname) = sqlite_fetch_array($results)) {  sqlite_close($sqldb);

回頁首

使用 SQLite 和資料庫抽象層

兩個先進的開來源資料庫抽象層對 SQLite 提供支援:PEAR::DB,它們包含在 PHP V5 中,並且被認為是更輕量級的 ezSQL。通過預先使用 PHP 擴充和應用程式庫 (PEAR) 或 ezSQL,可將 SQLite 用於應用程式的快速複原,在以後需要時,可以將其無縫轉向更具工業性質的資料庫。

清單 8. 使用 ezSQL 和 SQLite

$users = $db->get_results("SELECT name, age FROM table1");foreach ( $users as $user ){            echo $user->name;            echo $user->age;}

城中另一個遊戲

SQLite 不是惟一的開源嵌入式資料庫引擎。如果 SQLite 不能滿足您的要求,請使用 Derby(是 Apache 孵化器項目)和 Cloudscape(IBM 公司的 Derby 商業版本,包括 IBM 支援和服務)。Cloudscape 於 1996 年誕生於 Cloudscape 公司。三年以後,Informix 軟體公司併購了 Cloudscape,2001 年,IBM 併購了 Informix 軟體公司的資料庫資產,其中包括 Cloudscape。去年,IBM 將此代碼像 “Derby”一樣作為孵化器項目獻給了 Apache Software Foundation。

Derby 是100 % 的 Java 程式設計語言關聯式資料庫,並提供了預存程序和觸發器,行級鎖定,可以執行事務提交和後援動作,並支援加密。

最近,Zend 公司為 IBM 發布了 Zend Core,該軟體可以看作是基於 PHP V5 的解決方案,其中包括用於 Cloudscape 的 PHP 擴充和綁定的 Cloudscape 資料庫伺服器。

回頁首

SQLite 使用注意事項

在確定是否在應用程式中使用 SQLite 之前,應該考慮以下幾種情況:

  • 目前沒有可用於 SQLite 的網路伺服器。從應用程式運行位於其他電腦上的 SQLite 的惟一方法是從網際網路共用運行。這樣會導致一些問題,像 UNIX 和 Windows 網際網路共用都存在檔案鎖定問題。還有由於與訪問網際網路共用相關的延遲而帶來的效能下降問題。
  • SQLite 只提供資料庫級的鎖定。雖然有一些增加並發的技巧,但是,如果應用程式需要的是表層級或行層級的鎖定,那麼 DBMS 能夠更好地滿足您的需求。
  • 正如前面提到的,SQLite 可以支援每天大約 100,00 次點擊率的 Web 網站 —— 並且,在某些情況下,可以處理 10 倍於此的通訊量。對於具有高通訊量或需要支援龐大瀏覽人數的 Web 網站來說,應該考慮使用 DBMS。
  • SQLite 沒有使用者帳戶概念,而是根據檔案系統確定所有資料庫的許可權。這會使強制執行儲存配額發生困難,強制執行使用者許可變得不可能。
  • SQLite 支援多數(但不是全部)的 SQL92 標準。不受支援的一些功能包括完全觸發器支援和可寫視圖。請參閱 unimplemented SQL92 features。

如果您感到其中的任何限制會影響您的應用程式,那麼您應該考慮使用完善的 DBMS。如果您可以解除這些限制問題,並且對快速靈活的嵌入式開來源資料庫引擎高度興趣,則應重點考慮使用 SQLite。

一些能夠真正表現 SQLite 優越效能的領域是 Web 網站,可以使用 SQLite 管理應用程式資料、快速應用程式原型製造和培訓工具。

回頁首

結束語

由於資源佔用少、效能良好和零管理成本,嵌入式資料庫有了它的用武之地,它將為那些以前無法提供用作持久資料的後端的資料庫的應用程式提供了高效的效能。現在,沒有必要使用文字檔來實現持久儲存。SQLite 之類的嵌入式資料庫的便於使用性可以加快應用程式的開發,並使得小型應用程式能夠完全支援複雜的 SQL。這一點對於對於小型裝置空間的應用程式來說尤其重要。

嵌入式資料庫對於加快應用程式開發也很重要,尤其是在用於資料庫抽象層(例如 PEAR::DB 或 ezSQL)時。最後,SQLite 正在積極開發中,未來一定會有新的功能,會對開源社區更有用。

回頁首

參考資料

  • 您可以參閱本文在 developerWorks 全球網站上的 英文原文。

  • 請訪問 SQLite,以下載最新版本的 SQLite、命令列介面、文檔和最新訊息。
  • 下載 SQLiteManager,使 SQLite 資料庫管理更方便。
  • 從 PHP.net 下載包括 SQLite 的 PHP V5。
  • 請參閱 developerWorks 上的文章“ 審計 PHP,第 1 部分: 理解 register_globals”,瞭解開發人員建立 PHP 應用程式時需要牢記的一些基本問題。
  • “PHP 簡介”是對 PHP 指令碼語言的一個簡要介紹,並討論了 PHP 的起源、功能及其使用的平台。
  • “PHP 例解,第 1 部分”是系列文章中第一部分,它介紹了 PHP 的一些基礎知識。描述了包括作者頁和前端的 Webzine,在作者頁中,內容提供者可以輸入文章的本文,前端用於將這些內容介紹給全世界的讀者。
  • “學習 PHP,第 1 部分” 是由三個部分組成的文章列系中的第 1 部分,通過記錄文檔工作流程系統的構建過程,全面介紹 PHP,從檔案系統的最基本的 PHP 指令碼,到使用資料庫和流。
  • 可以從 The PHP Extension and Application Repository 獲得 PEAR::DB 資料庫抽象層。
  • 請訪問 jvmultimedia,下載 ezSQL 資料庫抽象層。
  • 請購買 Chris Newman 撰寫的 SQLite 一書,該書主要介紹了開源的嵌入式資料庫。
  • 瞭解關於 Apache 孵化項目 Derby 和 IBM Cloudscape 的更多資訊。
  • 請下載包括 Cloudscape 的 combined PHP V5 binary distribution。
  • 請參閱 developerWorks 的 開源專區,瞭解更多的 how-to 資訊、工具和項目更新,協助您使用開源技術進行開發,並將這些技術用於 IBM 的產品中。
  • 使用 IBM 試用軟體 改進您的下一個開源開發項目,可以通過下載或從 DVD 中獲得這些軟體。
  • 通過參與 developerWorks blogs 加入 developerWorks 社區。

回頁首

關於作者

Nils-Erik Frantzell 是一名位於聖克魯斯的加州大學的大學四年級學生。他的興趣包括資料庫(尤其是內部資料庫)、資訊管理、Web 技術以及一些電腦硬體。他的業餘愛好是飼養熱帶魚和欣賞電子音樂。

from: http://www-128.ibm.com/developerworks/cn/opensource/os-sqlite/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.