Spec-Zone.ru › SQLite

Базы данных в оперативной памяти

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

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

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

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

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

ATTACH DATABASE ':memory:' AS aux1;

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

Специальное имя файла «:memory:» также работает при использовании имен файлов URI. Например:

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

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

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

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

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

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

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 испытывает недостаток памяти.

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

SQLite is in the Public Domain.
https://sqlite.org/inmemorydb.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API