摘自peter的文章,Sqlite內(nèi)存數(shù)據(jù)庫(kù)因?yàn)樗俣瓤,操作方便而讓sqlite在一些企業(yè)應(yīng)用場(chǎng)景非常有用,如經(jīng)常使用的產(chǎn)品信息 BOM信息等。如果每次都從數(shù)據(jù)庫(kù)服務(wù)器讀取加載,速度會(huì)比較慢。這時(shí)內(nèi)存數(shù)據(jù)庫(kù)就非常有用了。
一、初識(shí)sqlite 偶然的機(jī)會(huì)接觸到sqlite,不禁驚嘆sqlite的體型小巧而功能強(qiáng)大(看來(lái)軟件也不可貌相哦),Sqlite 是開(kāi)源的內(nèi)存數(shù)據(jù)庫(kù)(也可以稱之為內(nèi)嵌式數(shù)據(jù)庫(kù)),大量無(wú)私的程序員為sqlite發(fā)展貢獻(xiàn)了自己的力量。Sqlite 應(yīng)用極廣,手機(jī)、mp3,機(jī)頂盒可能存在sqlite身影,Apple的Mac os,linux,或者windows在安裝第三方軟件時(shí)也可以應(yīng)用sqlite。 Sqlite技術(shù)優(yōu)點(diǎn): 1. Sqlite輕量級(jí)、跨平臺(tái)的關(guān)系型開(kāi)源內(nèi)存數(shù)據(jù)庫(kù),使用sqlite只需帶上動(dòng)態(tài)庫(kù),就可使用sqlite全部功能(動(dòng)態(tài)庫(kù)Windows下487KB,Linux下347KB); 2. 核心引擎不依賴第三方軟件,也不需要安裝; 3. 數(shù)據(jù)庫(kù)中所有的信息(比如表、視圖、觸發(fā)器、等)都包含在一個(gè)文件內(nèi)。這個(gè)文件可以copy到其它目錄或其它機(jī)器上,也照用不誤。如果使用內(nèi)存方式,可以沒(méi)有該文件; 4. 除了主流操作系統(tǒng),SQLite還支持了很多冷門(mén)的操作系統(tǒng)。它對(duì)很多嵌入式系統(tǒng)(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)也支持; 5. SQLite的API不區(qū)分當(dāng)前操作的數(shù)據(jù)庫(kù)是在內(nèi)存還是在文件(對(duì)于存儲(chǔ)介質(zhì)是透明的); 等等;
缺點(diǎn): 1. 并發(fā)訪問(wèn)的鎖機(jī)制
SQLite在并發(fā)(包括多進(jìn)程和多線程)讀寫(xiě)方面的性能不太理想。數(shù)據(jù)庫(kù)可能會(huì)被寫(xiě)操作獨(dú)占,從而導(dǎo)致其它讀寫(xiě)操作阻塞或出錯(cuò); 2. SQL標(biāo)準(zhǔn)支持不全 如不支持外鍵約束;
看來(lái)還是優(yōu)點(diǎn)多于缺點(diǎn)!呵呵! 二、sqlite體系機(jī)構(gòu) sqlite模塊將 查詢過(guò)程分為幾個(gè)不連續(xù)的任務(wù),在結(jié)構(gòu)棧的頂部編譯查詢語(yǔ)句,中不執(zhí)行,在底部處理操作系統(tǒng)的存儲(chǔ)和接口。 ![]() ." action-data="http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201109%2F8%2F0_1315465068M797.gif" action-type="show-slide" style="border: 0px; list-style: none;"> 圖1-2SQLite的體系結(jié)構(gòu) (注:結(jié)構(gòu)圖轉(zhuǎn)載于《SQLite權(quán)威指南》) 三、sqlite文件數(shù)據(jù)庫(kù)、內(nèi)存數(shù)據(jù)庫(kù)建立及導(dǎo)入導(dǎo)出 sqlite官網(wǎng)( www.sqlite.org)同時(shí)提供已編譯版本和源程序。同時(shí)適用于Windows和linux。 經(jīng)過(guò)前面sqlite熱身之后,趕緊轉(zhuǎn)入正題,干點(diǎn)正事!(*^__^*) 3.1 文件數(shù)據(jù)庫(kù)、內(nèi)存數(shù)據(jù)庫(kù)的建立3.1.1文件數(shù)據(jù)庫(kù)的建立Windows: 1) 下載sqlite最新版本sqlite3.exe; 2) dos進(jìn)入到執(zhí)行程序目錄下; 3) 輸入 sqlite3 d:\test.db(如果后面執(zhí)行路徑存在test.db 則打開(kāi)數(shù)據(jù)庫(kù);如果執(zhí)行路徑下不存在test.db則新建test.db); Linux: 1) 下載sqlite最新版本sqlite3; 2) Shell進(jìn)入到可知性程序目錄下; 3) 輸入sqlite3 /home/test.db(如果后面執(zhí)行路徑存在test.db 則打開(kāi)數(shù)據(jù)庫(kù);如果執(zhí)行路徑下不存在test.db則新建test.db); 至此則打開(kāi)或者新建一個(gè)文件數(shù)據(jù)庫(kù)庫(kù); 3.1.2 內(nèi)存數(shù)據(jù)庫(kù)的建立[cpp]
- C代碼示例:
- sqlite3 *db;
- rc = sqlite3_open(":memory:",&db); // 內(nèi)存中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
- 3.2 文件數(shù)據(jù)庫(kù)、內(nèi)存數(shù)據(jù)庫(kù)的導(dǎo)入導(dǎo)出
- C代碼示例:
- ////////////////////////////////////////////////////////////////////////////////////////////
- //參數(shù)說(shuō)明:
- //pInMemory: 指向內(nèi)存數(shù)據(jù)庫(kù)指針
- //zFilename: 指向文件數(shù)據(jù)庫(kù)目錄的字符串指針
- //isSave 0: 從文件數(shù)據(jù)庫(kù)載入到內(nèi)存數(shù)據(jù)庫(kù) 1:從內(nèi)存數(shù)據(jù)庫(kù)備份到文件數(shù)據(jù)庫(kù)
- ////////////////////////////////////////////////////////////////////////////////////////////
- int loadOrSaveDb(sqlite3 *pInMemeory, const char *zFilename, int isSave)
- {
- int rc;
- sqlite3 *pFile;
- sqlite3_backup *pBackup;
- sqlite3 *pTo;
- sqlite3 *pFrom;
- rc = sqlite3_open(zFilename, &pFile);
- if(rc == SQLITE_OK)
- {
- pFrom = (isSave?pInMemeory:pFile);
- pTo = (isSave?pFile:pInMemeory);
- pBackup = sqlite3_backup_init(pTo,"main",pFrom,"main");
- if(pBackup)
- {
- (void)sqlite3_backup_step(pBackup,-1);
- (void)sqlite3_backup_finish(pBackup);
- }
- rc = sqlite3_errcode(pTo);
- }
- (void)sqlite3_close(pFile);
- return rc;
- }
調(diào)用實(shí)例:
[cpp]
- int ret = 0;
- char *filename = “d:\\test.db”;
- sqlite3 *memoryDb;
- ret = sqlite3_open(“memory:”, &memoryDb);
- ret = loadOrSaveDb(memoryDb, filename, 0) //文件數(shù)據(jù)庫(kù)導(dǎo)入到內(nèi)存數(shù)據(jù)庫(kù)
3.3 文件數(shù)據(jù)庫(kù)命令格式的導(dǎo)入導(dǎo)出 3.3.1 文件數(shù)據(jù)庫(kù)命令格式數(shù)據(jù)導(dǎo)出、備份方法一:(sqlite數(shù)據(jù)庫(kù)內(nèi)部) Sqlite>.output d:\test.sql
相關(guān)文章:
sqlite建立內(nèi)存數(shù)據(jù)庫(kù)方法為打開(kāi)數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)名稱用 :memory: 。 下面為如何將文件數(shù)據(jù)庫(kù)附加到內(nèi)存數(shù)據(jù)庫(kù)中 如果你使用內(nèi)存數(shù)據(jù)庫(kù) 我猜想,SQLite會(huì)使用系統(tǒng)默認(rèn)的編碼。 所以,你如果你要把數(shù)據(jù)庫(kù)附加到內(nèi)存數(shù)據(jù)庫(kù)時(shí),則需要注意附加的文件編碼也要使用系統(tǒng)默認(rèn)的。 否則,你無(wú)法使用附加的數(shù)據(jù)。 關(guān)鍵點(diǎn):編碼問(wèn)題。 還有一個(gè)問(wèn)題,你的語(yǔ)法對(duì)了嗎? 正確的語(yǔ)法:@"ATTACH 'd:\gldstest.db' as db333 key '123456'
以下是一個(gè)前輩在一篇文章《SQLite的加密擴(kuò)展方法 》提到的三個(gè)方法: 在sqlite3sec中你可以使用下列三種方法來(lái)添加一個(gè)加密的數(shù)據(jù)庫(kù): sqlite> ATTACH 'b.db' AS b; sqlite> ATTACH 'b.db' AS b KEY 'your passphrase'; sqlite> ATTACH 'b.db' AS b KEY blob;
第一種方法使用和主數(shù)據(jù)庫(kù)相同的密碼(或者是沒(méi)有密碼) , 第二種方法用你輸入的短語(yǔ)來(lái)做密碼. 第三種方法假設(shè)你用BLOB的十六進(jìn)制值作為密碼(例如 f03d69ac3981...). 不過(guò)我還沒(méi)有充分的測(cè)試這個(gè)使用BLOB作為密碼的版本. 請(qǐng)注意:如果你的主數(shù)據(jù)庫(kù)是加密的,然后你想添加一個(gè)不加密的數(shù)據(jù)庫(kù),這種情況下你需要用第二種方法然后傳遞一個(gè)空字符串('')作為密碼.
|