RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Базы данных в памяти

База данных SQLite обычно хранится в единственном обычном дисковом файле. Однако при определенных обстоятельствах, база данных могла бы быть сохранена в памяти.

Наиболее распространенный способ вынудить базу данных SQLite существовать просто в памяти состоит в том, чтобы открыть базу данных, используя специальное имя файла ":memory:". Другими словами, вместо того, чтобы передать название реального дискового файла в один из вызовов sqlite3_open(), sqlite3_open16() или sqlite3_open_v2(), передайте строку ":memory:":

rc = sqlite3_open(":memory:", &db);

Когда это сделано, никакой дисковый файл не открыт. Вместо этого новая база данных создается просто в памяти. База данных прекращает существование, как только соединение с базой данных закрывается. Каждая БД :memory: отлична от другой. Так, открывая два соединения с базой данных каждое с именем файла ":memory:", вы создаете две независимых базы данных в памяти.

Специальное имя файла ":memory:" может использоваться где угодно, где разрешено имя файла базы данных. Например, это может использоваться в качестве filename в команде ATTACH:

ATTACH DATABASE ':memory:' AS aux1;

Отметьте что для специального имени ":memory:", чтобы примениться и создать чистую базу данных в памяти, в имени файла не должно быть никакого дополнительного текста. Таким образом находящаяся на диске база данных может быть создана в файле, если указать нечто вроде "./:memory:".

Имя файла ":memory:" также работает, используя URI filenames:

rc = sqlite3_open("file::memory:", &db);
Или
ATTACH DATABASE 'file::memory:' AS aux1;

Базы данных в памяти и общий кэш

Базам данных в памяти позволяют использовать общий кэш, если они открыты, используя URI filename. Если имя ":memory:" используется, чтобы определить базу данных в памяти, тогда та база данных всегда имеет частный кэш и видима только соединению с базой данных, которое первоначально ее открыло. Однако, та же самая база данных в памяти может быть открыта двумя или больше соединениями с базой данных следующим образом:

rc = sqlite3_open("file::memory:?cache=shared", &db);
Или
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;

Это позволяет отдельным соединениям с базой данных разделять ту же самую базу данных в памяти. Конечно, все соединения с базой данных, разделяющие базу данных в памяти, должны быть в том же самом процессе. База данных автоматически удалена, и память освобождена, когда последняя связь с базой данных закрывается.

Если две или больше отличных, но общих базы данных в памяти необходимы в единственном процессе, то параметр запроса mode=memory может использоваться с URI filename, чтобы создать названную базу данных в памяти:

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);
Или
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;

Когда базу данных в памяти назовут таким образом, она разделит свой кэш только с другой связью, которая использует точно то же самое имя.

Временные базы данных

Когда название файла базы данных для sqlite3_open() или ATTACH является пустой строкой, тогда новый временный файл создается, чтобы хранить базу данных.

rc = sqlite3_open("", &db);
ATTACH DATABASE '' AS aux2;

Различный временный файл создается каждый раз, как со специальным именем ":memory:", если есть два соединения с базой данных к временным базам данных, то у каждого есть собственная частная база данных. Временные базы данных автоматически удалены, когда связь, которая создала их, завершена.

Даже при том, что дисковый файл ассигнуется для каждой временной базы данных, на практике временная база данных обычно проживает в кэше страниц в памяти и следовательно есть очень мало различия между чистой базой данных в памяти, созданной ":memory:", и временной базой данных, которая создается пустым именем файла. Единственное различие в том, что БД ":memory:" должна остаться в памяти в любом случае, тогда как части временной базы данных могли бы выгрузиться на диск, если база данных становится большой или если SQLite попадает под давление памяти.

Предыдущие параграфы описывают поведение временных баз данных в конфигурации по умолчанию. Приложение может использовать temp_store pragma и опцию времени компиляции SQLITE_TEMP_STORE, чтобы вынудить временные базы данных вести себя как чистые базы данных в памяти при желании.