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