1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      開源嵌入式數據庫Bericel ey DB和SQLite的比較

      更新時間: 2006-04-30 23:04:09來源: 粵嵌教育瀏覽量:1399

          深入分析、比較Berkeley DBsQLiteBerkel ey DBsQLite是源碼開放的嵌入式數據庫管理系統,無需安裝,體積小巧,速度又很快;可以很方便地應用在掌上電腦、PDA、車載設備、移動電話等MySQLSQL Server這些大中型數據庫不可實現的嵌入式設備上。

      關鍵詞Berkeley DB  SOLite  嵌入式數據庫

      1 嵌入式數據庫 

      通常,我們采用數據庫來實現對數據的存儲、檢索等功能。像MySQL這類基于CS結構的關系型數據庫系統,雖然代表著目前數據庫應用的主流,卻并不能滿足所有應用場合的需要。很多的應用,僅僅利用到了這些數據庫產品的基本特性而已。有時我們需要的可能只是一個簡單的基于磁盤文件的數據庫系統,這樣就不必安裝龐大的數據庫服務器,以簡化數據庫應用程序的設計。在某些特殊應用場合,比如在嵌入式系統中,由于系統的硬件軟件資源都有限,這些數據庫產品就明顯有一些臃腫,甚至是不可實現的。在這些情況下,嵌入式數據庫的優勢就特別明顯了。

      嵌入式數據庫通常與操作系統和具體應用集成在一起,無須獨立運行的數據庫引擎,由程序直接調用相應的API去實現對數據的存取操作。更直白地講,嵌入式數據庫是一種具備了基本數據庫特性的數據文件。嵌入式數據庫與其它數據庫產品的區別是,前者是程序驅動式,而后者是引擎響應式。嵌入式數據庫的一個很重要的特點是它們的體積非常小,編譯后的產品也不過幾十KB,在一些移動設備上極具競爭力。

      從目前嵌入式應用的發展趨勢來看,嵌入式數據庫的實現必須充分體現系統的可定制性,即系統選擇的技術路線要面向具體的行業應用,因而研究源碼開放的嵌入式數據庫具有特殊意義。

      2 Berkeley DBSQLite

      DBkeley DB是一款健壯的、高速的工業級開放源代碼的嵌入式數據庫管理系統。應用它,程序員只需要調用一些簡單的API就可以完成對數據的訪問和管理。

      Berkeley DB的源代碼有CJava兩種,函數庫本身只有300KB左右,但卻能夠用來管理多達256TB的數據。Berkeley DB作為一種嵌入式數據庫系統在許多方面有著獨特的優勢。首先,由于其應用程序和數據庫管理系統運行在相同的進程空間當中,進行數據操作時可以避免繁瑣的進程間通信,因此耗費在通信上的開銷自然也就降低到了極低程度。其次,Berkeley DB使用簡單的函數調用接口來完成所有的數據庫操作,而不是在數據庫系統中經常用到的SQL語言,避免了對結構化查詢語言進行解析和處理所需的開銷。

      SQLite的源代碼是C,其源代碼完全開放。SQLiteAlpha版本誕生于20005月。今年5月,SQLite又迎來了一個新的里程一SOLite 3

      SQLite有以下特性:支持ACID事務;零配置一無需安裝和管理配置;儲存在單一磁盤文件中的一個完整的數據庫;數據庫文件可以在不同字節順序的機器間自由共享;支持數據庫大小至2TB;足夠小,全部源碼大致3萬行c代碼,250KB;比目前流行的大多數數據庫對數據的操作要快;提供了對事務功能和并發處理的支持,應用Transaction既保證了數據的完整性,也會提高運行速度,因為多條語句一起提交給數據庫的速度會比一條一條的提交方式更快;獨立,沒有額外依賴。

      目前,對Berkeley DB的研究開發工作主要是美國的sleepycat公司在進行,在國內幾乎沒有關于這方面的研究;而SQLite在國內也是鮮有人問津。

      21  Berkeley DBSOLite的數據庫操作

      與常用的數據庫管理系統(MySQLOracle)有所不同,在Berkeley DB中并沒有數據庫服務器的概念。應用程序不需要事先同數據庫服務建立起網絡連接,而是通過內嵌在程序中的Berkeley DB函數庫來完成對數據的保存、查詢、修改和刪除等操作。所有與數據庫相關的操作都由函數庫負責統一完成,這樣無論是系統中的多個進程,或者是相同進程中的多個線程,都可以在同一時間調用訪問數據庫的函數;而底層的數據加鎖、事務日志和存儲管理等都在Berkeley DB函數庫中實現。它們對應用程序來講是完全透明的。

      Berkeley DB不是關系型的數據庫,不能應用標準的SQL語句對數據庫操作,對它的操作要調用專用的API實現。這些API提供了查詢、插入、刪除等功能。比如com.sleepycat.db.Db類代表數據庫對象。Db類的put( )方法完成的是插入功能;get( )方法完成的是讀出數據的功能;com.sleepycat.db.DbcBerkeley DB的游標類,提供了遍歷數據庫記錄的功能。

      使用Berkeley DB提供的函數來進行數據庫的訪問和管理并不復雜。在大多數場合下,只需按照統一的接口標準進行調用就可以完成基本的操作,Berkeley DBEnvironment為一組數據庫同時提供參數設置。更為重要的是,如果要應用更的特性,必須要使用Environment功能,比如在要對保存的數據進行加密存儲、利用其Transaction、數據加密、同步加鎖控制、錯誤日志等功能的時候。

      SQLiteSQL語言很大程度上實現了ANSI SQL92標準,特別是支持視圖、觸發器、事務,支持嵌套SQL。它通過SQL編譯器(SQL Complier)來實現SQL語言對數據庫進行操作,支持大部分的SQL命令,如attach databasebegin transactioncommentcommit transactioncopycreate indexcreate tablecreate triggercreate viewdeletedetach databasedrop indexdrop tabledrop triggerdrop viewend transactionexplainexpressioninsertOn conflict clausepragmareplacerollback transactionselectupdate

      當然,也有一部分SQL命令SQLite并不支持。比如:不支持:Exists,雖然支持in(inExists的一種情況);不支持多數據庫,如create table dbl.tablel as select*from db2table 1;:不支持存儲過程;不支持Alter ViewTriggerTable:不支持Truncate  SQLiteDelete不帶Where字句時和Truancate的效果是一樣的;不支持FloorCeiling函數,還有其它許多的函數;沒有Auto Increment(自增)字段,但其實SQLite是支持Auto Increment的,即在將該字段設置為“INTEGER PRIMARY KEY”的時候;不支持If Exists等。

      22 Berkeley DBS0Lite與普通數據庫的差別

      Berkeley DB引入了一些新的基本概念,使得數據庫應用程序訪問和管理數據庫變得相對簡單起來。

      (1)關鍵字和數據

      關鍵字(key)和數據(data)是。BerkeleyDB用來進行數據庫管理的基礎,由這兩者構成的keydata對,組成了數據庫中的一個基本結構單元。整個數據庫實際上就是由許多這樣的結構單元構成的。通過使用這種方式,在通過API函數訪問數據庫時,只需提供關鍵字就能夠訪問到相應的數據。

      關鍵字和數據在Berkeley DB中都是用一個名為DBT的簡單結構來表示的。實際上兩者都可以是任意長度的二進制數據。DBT的作用主要是保存相應的內存地址及其長度,其結構如下所示:

      typedef struct {   

      void*data   

      u_int32_t size    

      u_int32_t ulen   

      u_int32_f dlen   

      u_int32_f doff   

      u_int32_f flags   

      }DBT   

      在使用Berkeley DB進行數據管理時,缺省情況下是一個關鍵字對應于一個數據;但也可以將數據庫配置成一個關鍵字對應于多個數據,而鍵值和數據必須是類com.sleepycat.db.Dbt的對象或其子類的對象。

      (2)對象句柄

      Berkeley DB函數庫定義的大多數函數都遵循同樣的調用原則:首先創建某個結構,然后再調用該結構中的某些方法。從程序設計的角度來講,這一點同面向對象的設計原則是非常類似的,即先創建某個對象的一個實例,然后再調用該實例的某些方法。正因為如此,.Berkeley DB引入了對象句柄的概念來表示實例化后的結構,并且將結構中的成員函數稱為該句柄的方法。對象句柄的引入使得程序員能夠憑借面向對象的思想,來完成對Berkeley DB數據庫的訪問和操作。

      (3)錯誤處理

      對于任何一個函數庫來說,如何對錯誤進行統一的處理都是需要考慮的問題。Berkeley DB提供的所有函數都遵循同樣的錯誤處理原則,即函數成功執行后返回零,否則返回非零值。

      對于系統錯誤(如磁盤空間不足),返回的是一個標準的值;而對于非系統錯誤,返回的則是一個特定的錯誤編碼。例如,如果在數據庫中沒有與某個特定關鍵字所對應的數據,那么在通過該關鍵字檢索數據時就會出現錯誤。此時函數的返回值將是DBNOTF0uND,表示在數據庫中并沒有所請求的關鍵字。所有標準的e rrn0值都大于零,而由Berkeley DB定義的特殊錯誤編碼則都小于零。

      BerkeleyDB提供了相應的函數來獲得錯誤代號所對應的錯誤描述。一旦有錯誤發生,只需首先調用db_strerror( )函數來獲得錯誤描述信息,然后再調用DB>err()DB->errx()就可以很輕松地輸出格式化后的錯誤信息。

      SQLite的特點在于其數據類型為無數據類型(typelessness)。這意味著可以保存任何類型的數據到所想要保存的任何表的任何列中,無論這列聲明的數據類型是什么。雖然在生成表結構的時候,要聲明每個域的數據類型,但sQLite并不做任何檢查。開發人員要靠自己的程序控制輸入與讀出數據的類型。這里有一個例外,就是當主鍵為整型值時,如果要插入一個非整型值時會產生異常。

      誠然,SQLite允許忽略數據類型,但是,仍然建議在Create Table語句中指定數據類型,因為數據類型有利于增強程序的可讀性。SQLite支持常見的數據類型,如VARCHARNVARCHARTEXTINTEGERFLOATBOOLEANCLOBBLOBTIMESTAMPNUMERICVARYINGCHARACTERNATl0NAI, VARYINGCHARACTER

      另外,雖然在插入或讀出數據的時候是不區分類型的,但在比較的時候,不同數據類型是有區別的。比如:CREATE TABLE MyTable (a INTEGERb TEXT) 

      INSERT INT0 MyTable VALIUES(00) 

      當執行查詢 

      SELECT count(*)FROM MyTable WHERE a==’00’;時,會返回一條記錄。因為字段a的類型是整型,而數字000是相等的。而執行查詢 

      SELECT count(*)FROM MyTable WHERE b==‘00’:時,則不會返回記錄。因為字段b是字符類型,字符“00”與“0”是不相等的。

      2.3 Betkeley DBSQLite數據存儲方式比較

      Berkeley DB對任何存入的數據都是按原樣直接存儲到數據文件中去,無論其是二進制數據還是A S C I IUnicode等編碼的文本。Berkeley DB提供了四種存儲數據的模式:BtreeHashQueueRecno。在打開數據庫的時候,要指定一種存儲模式。比如,上例中open( )方法中的參數DbDB_BTREE就是指定以Btree模式打開數據庫。

      SQLite只提供了Btree存儲數據的模式。對二進制數據,SQLite不能直接保存,但可以先將二進制的數據轉換成ASCII編碼,然后再保存。Base64.編碼機制是常見的把二進制數據轉換成ASCII編碼的手段。在SQLiteC語言代碼encode.c中,提供了Base64編碼的功能。

      Btree模式是以排序的二叉樹的方式存儲的,Hash是以線性哈希表的方式存儲。Queue用邏輯記錄號作為鍵值,以定長的數據為記錄值。Recno方式也以邏輯記錄號作為鍵值,但可以保存定長或變長的記錄值。這里提到的邏輯記錄號有兩種,即可變的和固定的。可變邏輯記錄號會根據數據記錄的增加與刪除作相應的變化。Queue模式下,邏輯記錄號只能是固定方式。Recno模式則可通過配置來選擇是采用哪種類型的記錄號作為鍵值。Btree模式也可以通過設置,將可變的邏輯記錄號作為鍵值。

      這幾種存儲模式各有優缺點,當鍵值不想用邏輯記錄號時,BtreeHash是必須的選擇。Btree方式比較適合連續的順序讀取。比如,當鍵值是時間值,如果經常有從某一時間點開始連續讀取后繼的記錄的操作,Btree是一種很好的選擇。對隨機的跳躍式讀取,Hash模式則更為恰當。QueueRecno都以記錄號為鍵值,但前者適合先進先出的讀取方式。Recno則通常是存取變長文本記錄的理想存儲模式。

      24  Berkeley DBS0Lite適用的系統

      Berkeley DB為許多編程語言提供了實用的API接口,包括CC++Java、:PerlTclPythonPHP等。它適用平臺UNIXPOSIX systemswin32以及嵌入式操作系統WinCEVxWorks等。

      通過WrapperSQLite實現了與其它語言的連接。所謂Wrapper即對SQLite提供的接口進行封裝,使其它語言可以訪問,使用SQLiteSQLite本身提供CTcl的接口,世界各地的程序員還提供了各種語言的SQLite的接口封裝, PythonC++Java.Net等幾乎所有流行的語言基本都有。sQLite提供一個抽象的操作系統接口層,來保證其在POSIX Win32系統之間的兼容性。

      2.5  其它方面 

      Berkeley DB沒有數據庫服務器的概念,使用簡單的函數調用接口來完成所有的數據庫操作,不使用SQL

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 一区二区三区国产免费AV | 亚洲日本另类欧美一区二区 | 亚洲乱码AV中文字幕 | 亚洲激情小视频在线看 | 亚洲天堂网5区在线观看 | 日本有码中文字幕第二页 |