![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
База данных SQLite обычно хранится в единственном обычном дисковом файле.
Однако при определенных обстоятельствах, база данных могла бы
быть сохранена в памяти. Наиболее распространенный способ вынудить базу данных SQLite существовать
просто в памяти состоит в том, чтобы открыть базу данных, используя
специальное имя файла ":memory:". Другими словами, вместо того, чтобы
передать название реального дискового файла в один из вызовов
sqlite3_open(),
sqlite3_open16() или
sqlite3_open_v2(),
передайте строку ":memory:": Когда это сделано, никакой дисковый файл не открыт. Вместо этого новая
база данных создается просто в памяти. База данных прекращает существование,
как только соединение с базой данных закрывается. Каждая БД :memory:
отлична от другой. Так, открывая два соединения с базой данных каждое с
именем файла ":memory:", вы создаете две независимых
базы данных в памяти. Специальное имя файла ":memory:" может использоваться где угодно, где
разрешено имя файла базы данных. Например, это может использоваться в
качестве filename в команде ATTACH: Отметьте что для специального имени ":memory:", чтобы примениться и
создать чистую базу данных в памяти, в имени файла не должно быть никакого
дополнительного текста. Таким образом находящаяся на диске база данных может
быть создана в файле, если указать нечто вроде "./:memory:". Имя файла ":memory:" также работает, используя
URI filenames:
Базам данных в памяти позволяют использовать
общий кэш,
если они открыты, используя URI filename.
Если имя ":memory:" используется, чтобы определить базу данных в памяти,
тогда та база данных всегда имеет частный кэш и видима только соединению с
базой данных, которое первоначально ее открыло.
Однако, та же самая база данных в памяти может быть открыта двумя или больше
соединениями с базой данных следующим образом:
Это позволяет отдельным соединениям с базой данных разделять ту же самую
базу данных в памяти. Конечно, все соединения с базой данных, разделяющие
базу данных в памяти, должны быть в том же самом процессе. База данных
автоматически удалена, и память освобождена, когда последняя связь с
базой данных закрывается.
Если две или больше отличных, но общих базы данных в памяти необходимы
в единственном процессе, то параметр запроса
mode=memory может использоваться с URI filename,
чтобы создать названную базу данных в памяти:
Когда базу данных в памяти назовут таким образом, она разделит свой кэш
только с другой связью, которая использует точно то же самое имя.
Когда название файла базы данных для
sqlite3_open() или
ATTACH
является пустой строкой, тогда новый временный файл создается, чтобы
хранить базу данных. Различный временный файл создается каждый раз, как со специальным
именем ":memory:", если есть два соединения с базой данных к временным базам
данных, то у каждого есть собственная частная база данных.
Временные базы данных автоматически удалены, когда связь, которая
создала их, завершена. Даже при том, что дисковый файл ассигнуется для каждой временной базы
данных, на практике временная база данных обычно проживает в кэше страниц
в памяти и следовательно есть очень мало различия между чистой базой данных
в памяти, созданной ":memory:", и временной базой данных, которая создается
пустым именем файла. Единственное различие в том, что БД ":memory:"
должна остаться в памяти в любом случае, тогда как части временной базы
данных могли бы выгрузиться на диск, если база данных становится большой или
если SQLite попадает под давление памяти. Предыдущие параграфы описывают поведение временных баз данных в
конфигурации по умолчанию. Приложение может использовать
temp_store pragma и опцию
времени компиляции SQLITE_TEMP_STORE,
чтобы вынудить временные базы данных вести себя как чистые базы данных в
памяти при желании.
Choose any three.
Базы данных в памяти
rc = sqlite3_open(":memory:", &db);
ATTACH DATABASE ':memory:' AS aux1;
Или
rc = sqlite3_open("file::memory:", &db);
ATTACH DATABASE 'file::memory:' AS aux1;
Базы данных в памяти и общий кэш
Или
rc = sqlite3_open("file::memory:?cache=shared", &db);
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
Или
rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;
Временные базы данных
rc = sqlite3_open("", &db);
ATTACH DATABASE '' AS aux2;