Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

返回列表 發(fā)新帖
查看: 6023|回復(fù): 5
打印 上一主題 下一主題

[ADO/DAO] sqlite內(nèi)存數(shù)據(jù)庫(kù)的使用以及內(nèi)存數(shù)據(jù)庫(kù)導(dǎo)入導(dǎo)出

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-5-18 12:00:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
摘自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è)空字符串('')作為密碼.


評(píng)分

參與人數(shù) 1經(jīng)驗(yàn) +1 收起 理由
風(fēng)中漫步 + 1 謝謝分享

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2015-5-18 13:32:46 | 只看該作者
主要缺點(diǎn)還是不支持網(wǎng)絡(luò).僅支持一寫(xiě)多讀.至于標(biāo)準(zhǔn),很多公司都有自己的小準(zhǔn)則,acc有的也不支持.
估計(jì)用慣ms產(chǎn)品的網(wǎng)友對(duì)他一定沒(méi)好感{:soso_e100:}

點(diǎn)擊這里給我發(fā)消息

3#
 樓主| 發(fā)表于 2015-5-18 13:44:11 | 只看該作者
主要缺點(diǎn)是 并發(fā)操作
4#
發(fā)表于 2015-5-18 14:11:26 | 只看該作者
呵呵,站長(zhǎng)把它用在什么地方了?
單機(jī)不會(huì)有那些并發(fā)吧
請(qǐng)指教
5#
發(fā)表于 2015-5-18 15:58:34 | 只看該作者
額,我一直以為mongodb比較好呢{:soso_e120:}——不過(guò)那是NOSQL的,做網(wǎng)頁(yè)前端也行用得上{:soso_e120:}
附上主流數(shù)據(jù)庫(kù)排行榜
http://db-engines.com/en/ranking
6#
發(fā)表于 2015-5-18 17:33:40 | 只看該作者
roych 發(fā)表于 2015-5-18 15:58
額,我一直以為mongodb比較好呢——不過(guò)那是NOSQL的,做網(wǎng)頁(yè)前端也行用得上
附 ...

聽(tīng)說(shuō)mongodb也不錯(cuò)啊.只是許可不給力.
sqlite是真正的自由軟件,袖珍,用在移動(dòng)便攜設(shè)備上很合適.傳說(shuō)最早是為美軍導(dǎo)彈驅(qū)逐艦上設(shè)計(jì)的,設(shè)計(jì)初衷就是要簡(jiǎn)單小巧,差不多也做到了.
個(gè)人覺(jué)得它最大的優(yōu)點(diǎn)是跨平臺(tái)且袖珍.
功能也符合它的身段,夠用.
看它的設(shè)計(jì),當(dāng)初作者可能也有其他打算.
謝謝斑竹的排行榜,長(zhǎng)見(jiàn)識(shí)了
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 08:05 , Processed in 0.143612 second(s), 37 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表