【第174期 March 5, 2012】
 

研發新視界

嵌入式資料庫SQLite實務初探

作者/范銘傑

[發表日期:2012/3/5]


前言

在商業應用程式被廣泛應用的現今而言,資料庫成為了軟體應用程式中,主要的組成部分,挾帶資料庫管理的功能,使得功能越來越豐富的資料庫,本身也變得越來越龐大,並占用了相當多的系統資源,以及增加了管理的複雜性。

隨著軟體應用程式逐漸模組化,基於某些使用情形下,另一種形式的資料庫因應而生--【嵌入式資料庫Embedded Database】,他能更適性的被使用,並能在應用程式執行中,提供了zero-configuration的運行模式,並且佔用非常少的資源。

非嵌入式資料庫不可?

嵌入式資料庫讓人輕易的聯想到嵌入式系統,例如電子儀器或韌體上就很容易發現它們的存在,其實現在的軟體開發也越來越常見相關的應用,大致應用的情境可能包含:處理的資料只有數千筆且異動不大,希望能在離線的單機下也能進行資料存取,即使有網路也不想為了這個程式架設一個資料庫,又或者這個應用程式沒有多人一起存取的需求,希望一次性安裝…等。

在以上的情境下,非嵌入式資料庫不可?除了使用嵌入式資料庫外,其實軟體開發上,大致還可以採取以下兩種方式:

一、在同一台機器上架設資料庫系統。第一種方法,對於使用者來說可能會是個大問題。因為不是每位使用者都懂得,而且願意架設一個資料庫系統在自己的電腦上,甚至電腦本身效能夠不夠好,致使一個資料庫系統能否順暢的運作都是問題。

二、使用小型的資料庫系統,諸如:GDBM,Windows的Registry,Access…等,或直接使用CSV格式的文字檔。第二種方法,是許多人常用的方式,尤其在Windows系統下面,許多人常常用Registry來作為軟體的資料庫。不過,少掉 了SQL的幫助,很多資料處理的功能都要自己來作,對於程式設計師來說較為辛苦。

相形之下,嵌入式資料庫會是相當不錯的折衷解法,因為對於程式設計師來說,使用這樣的資料庫,與使用一般的SQL資料庫差異不大。一般的SQL92語法都可以使用。而且不用架設任何系統起來,只要在編譯程式時把嵌入式資料庫一併編入,而且嵌入式資料庫都是單一的檔案。 所以,要將軟體安裝到使用者的電腦上是再簡單不過的事情。

嵌入式資料庫

定義為可以與程式語言整合,能夠一起編譯進應用程式,而不須要另外安裝的資料庫。嵌入式資料庫的一大好處就是在你的程式內部不需要網路配置,也不需要管理。因為用戶端和伺服器在同一程序空間運行。

雖然嵌入式資料庫所需的資源很少,但「嵌入式資料庫系統」的概念不是把系統縮小,而是以內建的方式進行整合,並加以多階式的網路通訊技術,將應用做無限制的擴大,全球化的軟體應用發展不再像主從式架構的時代僅能將系統局限在自己家裡或辦公室,無法延伸,而是要讓它的影響力可以隨處可及,資訊隨手可得。

常見的嵌入式資料庫

這邊提及三種免費且方便與.NET一同部署的嵌入式資料:

一、Microsoft SQL Server Compact Edition (MS SQL CE)

這是Visual Studio toolbox的一部份 (也將放在Visual Studio "Orcas"中),這是最方便而且免費的,安裝檔僅1.8MB,並另外有管理工具可以使用,很適合桌上型應用,缺點是沒有64-bit版本,同時, 因為是win32程式, 也無法運行在非Windows環境中。

另外, 可能會有人覺得這跟MS SQL Express有何不同,簡單說, CE不是執行成service也不是執行成server (這也是部署方便的原因),因此較不適合在多人共用的情況。

二、SQLite

非常有名的嵌入式資料庫,速度比MS SQL CE快,提供了hybrid DLL,包含有原生碼的SQLite engine,以及.NET provider,而根據不同環境有不同組的DLL (如win32, x64,,Itanium, .NET compact…等)。

三、Firebird

另一個有名的嵌入式資料庫,除了engine外,有提供ODBC/JDBC driver與.NET provider,分為classic與super server兩種版本,前者可以直接開資料庫檔案,後者則是有一個server process在持續運作。在32-bit Windows, Linux, Solaris…等主要作業系統都有對應版本。

談 SQLite

SQLite是一個開放原始碼的嵌入式關聯式資料庫,它在2000年由D. Richard Hipp發佈,它能減少應用程式管理資料的開銷,而且本身的可攜性好,很容易使用,安裝SIZE很小,高效而且可靠。SQLite嵌入到使用它的應用程式中,它們共用相同的執行空間,而不是單獨的一個程序,從外部看,它並不像一個RDBMS(relational database management system),但在程式內部,它卻是完整且包含engine的資料庫。


《圖一》SQLite可以在許多不同的平台上進行存取


《圖二》因為SQLite進行不同平台的語法剖析,並使用B-Tree做存取,不僅達到了跨平台的效用,效能上亦不落俗。


SQLite 的特性包含:

1.支援ACID (Atomic, Consistent, Isolated, Durable) 交易。
2.零組態設定(Zero-configuration),無須管理者的設定及管理。
3.支援大部分SQL92的語法。
4.資料庫存在於一個單一的檔案中。
5.資料庫系統所在機器的位元組順序(Byte order)無關。
6.支援大小至2 terabytes (2^41 bytes)。
7.極小的記憶體需求:小於3萬行的C語言程式碼。小於250KB的程式空間。
8.大部分的資料庫操作皆快於一般流行的資料庫系統。
9.簡單易用的API。
10.支援TCL。也有其他語言的支援可用。
11.註解詳細的程式碼,以及超過90%的測試。
12.程式庫自己包含完整的功能,無須其他額外的程式或程式庫。
13.程式碼版權為public domain。任何用途皆可免費使用。

SQLite 實作

這邊使用Windows環境並利用VS 2008的開發工具進行實作。

一、首先須先到官網http://www.sqlite.org/下載開發環境相對應的安裝檔。

二、將安裝檔進行安裝後,可以看到參考服務中,多了SQLite的相關dll檔。

《圖三》元件畫面


三、將System.Data.SQLite引用到專案之中


《圖四》專案引用的元件

四、引用完畢則可以開啟檢視中的伺服器總管,建立DB,步驟可參考如下:

《圖五》建立SQLite DB I


《圖六》建立SQLite DB II


《圖七》建立SQLite DB III


五、DB建立完成後,我們便可以開始使用,所使用的操作方式與一般ADO.NET無異,只在於呼叫的元件不同而已,例如以下: ( SQL Server vs. SQLite)


六、SQLite 既然為嵌入式資料庫,則可預期資料庫是跟著程式走的,如果希望資料庫是在程式執行時,才進行建立的動作的話,則使用Create語法就可以動態的產生一個資料庫,然而我們希望資料庫是預先建立好,進而部署到多位使用者的話,則需要在屬性上稍微調整,如此,程式在建立完成後,便會一併把DB進行產出。(如下設定)


《圖八》將建立的新DB加入專案中


《圖九》將新DB的屬性調整如圖


SQLite 在使用上應注意的地方

SQLite在應用上,提供了許多的便利性與不錯的效能,但有些地方仍需評估,其一是SQLite沒有提供型別檢查,因此,你可以把字串插入到整數列中,某些使用者發現這是使資料庫更加有用的創新,特別是使用在無型別差異的指令碼語言上,但其他使用者則可能認為這是主要的缺點,另一則是SQLite本身沒有Connection Pool的機制,因此當進行多筆資料的更新,插入動作時,例如是一千筆資料,如果不使用transaction,則Connection會開關一千次,此時跟使用Transaction,Connection只開關一次,其效能差異的多寡,可想而知。

結論

嵌入式資料庫與一般資料庫系統之間最明顯的差異,在於(1) 沒有server,以及 (2) 與程式語言可以緊密結合 - 有方便的函數呼叫,以及支援該語言慣用的資料結構。沒有server會讓部署變得容易,然而,也隱含了比較不適合多人共用,或是要交由應用程式自己來處理多人共用的部份。系統開發越趨多元,在開發工具的選擇上,更需要審慎的處理,即系統執行效能可能會因為評估不足而表現不佳。

參考資料

1.http://www.spotlight.net.tw/discuz/uchome/space.php?uid=1&do=blog&id=45
2.http://zh.wikipedia.org/wiki/SQLite
3.SQLite Document: The Definitive Guide to SQLite.pdf
4.http://www.kinghood.com.tw/thhu4.php
5.http://itgroup.blueshop.com.tw/tesco/blog?n=convew&i=3378
6.http://www.dev.idv.tw/mediawiki/index.php/%E7%B0%A1%E4%BB%8BSQLite