醫(yī)療圖片做網(wǎng)站圖片鎮(zhèn)江網(wǎng)絡(luò)
??返回:SQLite—系列文章目錄???
?上一篇:SQLite使用的臨時(shí)文件(二)
下一篇:SQLite中的原子提交(四)
??
SQLite數(shù)據(jù)庫(kù)通常存儲(chǔ)在單個(gè)普通磁盤中文件。但是,在某些情況下,數(shù)據(jù)庫(kù)可能存儲(chǔ)在內(nèi)存。
強(qiáng)制SQLite數(shù)據(jù)庫(kù)純粹存在的最常見(jiàn)方法在內(nèi)存中是使用特殊文件名打開(kāi)數(shù)據(jù)庫(kù)“:內(nèi)存:”。換句話說(shuō),而不是傳遞將真實(shí)磁盤文件放入sqlite3_open()、sqlite3_open16()或sqlite3_open_v2()函數(shù)之一,傳入字符串“:memory:”。為例:
rc = sqlite3_open(":memory:", &db);
完成此操作后,不會(huì)打開(kāi)任何磁盤文件。相反,將創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)純粹在內(nèi)存中。一旦數(shù)據(jù)庫(kù)停止存在,數(shù)據(jù)庫(kù)就不再存在連接已關(guān)閉。每個(gè):memory:數(shù)據(jù)庫(kù)都不同于其他。因此,打開(kāi)兩個(gè)數(shù)據(jù)庫(kù)連接,每個(gè)連接都使用文件名“:memory:”將創(chuàng)建兩個(gè)獨(dú)立的內(nèi)存數(shù)據(jù)庫(kù)。
特殊文件名“:memory:”可以在數(shù)據(jù)庫(kù)的任何位置使用允許使用文件名。例如,它可以用作ATTACH命令中的文件名:
ATTACH DATABASE ':memory:' AS aux1;
注意,為了應(yīng)用特殊的“:memory:”名稱,并且創(chuàng)建一個(gè)純內(nèi)存數(shù)據(jù)庫(kù),在文件名。因此,可以通過(guò)在文件中預(yù)先添加來(lái)創(chuàng)建基于磁盤的數(shù)據(jù)庫(kù)路徑名,如下所示:“./:memory:”。
特殊的“:memory:”文件名在使用URI文件名時(shí)也有效。例如:
rc = sqlite3_open("file::memory:", &db);
?或者
ATTACH DATABASE 'file::memory:' AS aux1;
內(nèi)存中數(shù)據(jù)庫(kù)和共享緩存
如果使用URI文件名打開(kāi)。如果使用樸素的“:memory:”名稱若要指定內(nèi)存中數(shù)據(jù)庫(kù),則該數(shù)據(jù)庫(kù)始終具有專用數(shù)據(jù)庫(kù)緩存,并且僅對(duì)最初打開(kāi)了它。但是,同一個(gè)內(nèi)存數(shù)據(jù)庫(kù)可以由兩個(gè)或更多數(shù)據(jù)庫(kù)連接如下:
rc = sqlite3_open("file::memory:?cache=shared", &db);
或者?
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
這允許單獨(dú)的數(shù)據(jù)庫(kù)連接共享相同的數(shù)據(jù)庫(kù)連接內(nèi)存中數(shù)據(jù)庫(kù)。當(dāng)然,所有數(shù)據(jù)庫(kù)連接共享內(nèi)存中數(shù)據(jù)庫(kù)需要處于同一進(jìn)程中。數(shù)據(jù)庫(kù)是自動(dòng)刪除,并在上次連接時(shí)回收內(nèi)存到數(shù)據(jù)庫(kù)關(guān)閉。
如果需要兩個(gè)或多個(gè)不同但可共享的內(nèi)存中數(shù)據(jù)庫(kù)在單個(gè)進(jìn)程中,則mode=memory查詢參數(shù)可以與URI文件名一起使用以創(chuàng)建命名的內(nèi)存中數(shù)據(jù)庫(kù):
rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);
或者:?
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;
以這種方式命名內(nèi)存中數(shù)據(jù)庫(kù)時(shí),它只會(huì)共享其緩存與使用完全相同名稱的另一個(gè)連接。
臨時(shí)數(shù)據(jù)庫(kù)
當(dāng)傳遞給sqlite3_open()或ATTACH的數(shù)據(jù)庫(kù)文件的名稱為空字符串時(shí),將創(chuàng)建一個(gè)新的臨時(shí)文件來(lái)保存數(shù)據(jù)庫(kù)。
rc = sqlite3_open("", &db);
ATTACH DATABASE '' AS aux2;
每次都會(huì)創(chuàng)建一個(gè)不同的臨時(shí)文件,以便,就像使用特殊的“:memory:”字符串,兩個(gè)數(shù)據(jù)庫(kù)連接到臨時(shí)每個(gè)數(shù)據(jù)庫(kù)都有自己的私有數(shù)據(jù)庫(kù)。臨時(shí)數(shù)據(jù)庫(kù)是當(dāng)創(chuàng)建它們的連接關(guān)閉時(shí)自動(dòng)刪除。
即使為每個(gè)臨時(shí)數(shù)據(jù)庫(kù)分配了一個(gè)磁盤文件,在練習(xí)臨時(shí)數(shù)據(jù)庫(kù)通常駐留在內(nèi)存尋呼機(jī)緩存中因此,純內(nèi)存數(shù)據(jù)庫(kù)之間幾乎沒(méi)有區(qū)別由“:memory:”創(chuàng)建,以及由空文件名創(chuàng)建的臨時(shí)數(shù)據(jù)庫(kù)。唯一的區(qū)別是“:memory:”數(shù)據(jù)庫(kù)必須保留在內(nèi)存中在任何時(shí)候,臨時(shí)數(shù)據(jù)庫(kù)的某些部分都可能被刷新到磁盤如果數(shù)據(jù)庫(kù)變大或SQLite處于內(nèi)存壓力之下。
前面幾段描述了臨時(shí)數(shù)據(jù)庫(kù)的行為在默認(rèn)的SQLite配置下。應(yīng)用程序可以使用temp_store編譯指示和SQLITE_TEMP_STORE編譯時(shí)參數(shù)來(lái)如果需要,強(qiáng)制臨時(shí)數(shù)據(jù)庫(kù)的行為為純內(nèi)存中數(shù)據(jù)庫(kù)。