今天注意到SQLite 3.6.11(上個月發(fā)布的)增加了一個我期待已久的online backup接口,激動之余就順便和大伙兒聊一下SQLite數(shù)據(jù)庫。本帖權(quán)當是SQLite掃盲,如果你對SQLite已經(jīng)很熟悉,本文就不必再看了。 ★技術(shù)上的優(yōu)點和特性 SQLite是一個輕量級、跨平臺的關(guān)系型數(shù)據(jù)庫。既然號稱關(guān)系型數(shù)據(jù)庫,支持SQL92標準中常用的玩意兒(比如視圖、事務(wù)、觸發(fā)器等)就是理所當然的了,咱今天就不細說了。今天主要聊聊一些有點特色的玩意兒。 ◇輕量級 先說它的第一個特色:輕量級。想必SQLite的作者很看重這個特性,連它的Logo都是用的“羽毛”,來顯擺它的輕飄飄。 SQLite和C/S模式的數(shù)據(jù)庫軟件不同,它是進程內(nèi)的數(shù)據(jù)庫引擎,因此不存在數(shù)據(jù)庫的客戶端和服務(wù)器。使用SQLite一般只需要帶上它的一個動態(tài)庫,就可以享受它的全部功能。而且那個動態(tài)庫的尺寸也挺小,以版本3.6.11為例,Windows下487KB、Linux下347KB。 ◇綠色軟件 SQLite的另外一個特點是綠色:它的核心引擎本身不依賴第三方的軟件,使用它也不需要“安裝”。所以在部署的時候能夠省去不少麻煩。 ◇單一文件 所謂的“單一文件”,就是數(shù)據(jù)庫中所有的信息(比如表、視圖、觸發(fā)器、等)都包含在一個文件內(nèi)。這個文件可以copy到其它目錄或其它機器上,也照用不誤。 ◇跨平臺/可移植性 如果光支持主流操作系統(tǒng),那就沒啥好吹噓的了。除了主流操作系統(tǒng),SQLite還支持了很多冷門的操作系統(tǒng)。我個人比較感興趣的是它對很多嵌入式系統(tǒng)(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。 ◇內(nèi)存數(shù)據(jù)庫(in-memory database) 這年頭,內(nèi)存越來越便宜,很多普通PC都開始以GB為單位來衡量內(nèi)存(服務(wù)器就更甭提了)。這時候,SQLite的內(nèi)存數(shù)據(jù)庫特性就越發(fā)顯得好用。 SQLite的API不區(qū)分當前操作的數(shù)據(jù)庫是在內(nèi)存還是在文件(對于存儲介質(zhì)是透明的)。所以如果你覺得磁盤I/O有可能成為瓶頸的話,可以考慮切換為內(nèi)存方式。切換的時候,操作SQLite的代碼基本不用大改,只要在開始時把文件Load到內(nèi)存,結(jié)束時把內(nèi)存的數(shù)據(jù)庫Dump回文件就OK了。在這種情況下,前面提到的“online backup API”就派上用場了,聰明的同學應(yīng)該明白我為啥這么期待backup功能了吧? ★技術(shù)上的缺點和不足 前面光聊了特性和優(yōu)點,為了避免槍手寫軟文的嫌疑,再來說說SQLite的一些缺點。列位看官將來如果想用它,這些缺點要權(quán)衡一下。 ◇并發(fā)訪問的鎖機制 SQLite在并發(fā)(包括多進程和多線程)讀寫方面的性能一直不太理想。數(shù)據(jù)庫可能會被寫操作獨占,從而導(dǎo)致其它讀寫操作阻塞或出錯。 ◇SQL標準支持不全 在它的官方網(wǎng)站上,具體列舉了不支持哪些SQL92標準。我個人感覺比較不爽的是不支持外鍵約束。 ◇網(wǎng)絡(luò)文件系統(tǒng)(以下簡稱NFS) 有時候需要訪問其它機器上的SQLite數(shù)據(jù)庫文件,就會把數(shù)據(jù)庫文件放置到網(wǎng)絡(luò)共享目錄上。這時候你就要小心了。當SQLite文件放置于NFS時,在并發(fā)讀寫的情況下可能會出問題(比如數(shù)據(jù)損壞)。原因據(jù)說是由于某些NFS的文件鎖實現(xiàn)上有Bug。 ★編程語言接口 SQLite支持很多種語言的編程接口。這對于我這種喜歡混用多種編程語言的人來說,是很爽的。下面我大概介紹一下。 ◇C/C++ 由于SQLite本身是C寫的,它自帶的API也是C接口的。所以C/C++用起來最直接了。假如你不喜歡面向過程的C API風格,可以另外找個C++的包裝庫。想重新發(fā)明輪子的同學,也可以自己包裝一個。 ◇Java 如果要用Java訪問SQLite,可以通過SQLite的JDBC驅(qū)動,或者通過專門的SQLite包裝庫。我個人建議走JDBC方式,萬一將來要換數(shù)據(jù)庫,代碼就不用大改。 ◇Python pysqlite是Python操作SQLite的首選。從Python 2.5開始,它已經(jīng)被整合到Python的標準庫中。看來Python社區(qū)還是蠻喜歡SQLite嘛。 ◇dotNet 對于喜歡dotNet的同學,可以通過SQLite的ADO.NET驅(qū)動來訪問。 ◇Ruby Ruby可以通過SQLite-Ruby操作SQLite數(shù)據(jù)庫,不過我沒用過。 ◇Perl 在CPAN上有DBD::SQLite,不過我也沒用過。 ★一些非技術(shù)的參考因素 前面講的都是技術(shù)層面的話題,如果你考慮在公司的商業(yè)軟件項目中使用SQLite。還需要根據(jù)“如何選擇開源項目”里面提到的幾個參考因素,再評估一下。 ◇授權(quán)協(xié)議(License) SQLite使用的是Public Domain協(xié)議,這是最爽一種,可以放心大膽地用。 ◇用戶的普及程度 最近這幾年,使用SQLite的人越來越多(從Google Trends可以反應(yīng)出來)。包括一些大公司也開始把它整合到產(chǎn)品中(比如Google的Gears、Apple的Safari、Adobe的AIR)。這說明它的健壯性、穩(wěn)定性等方面不會有太大問題。 ◇開發(fā)的活躍程度 如果到SQLite的Change Log上大致了解一下,可以看出最近5年基本上每1-2個月都會有更新。說明開發(fā)的活躍度還是非常高的。 從上述幾個非技術(shù)因素來看,SQLite用于商業(yè)公司的軟件項目還是非常靠譜的。 轉(zhuǎn)載必須包含本聲明、保持本文完整。并以超鏈接形式注明作者編程隨想和本文原始地址: http://program-think.blogspot.com/2009/03/opensource-review-sqlite-database.html |