Можно ли получить масштабируемый многопоточный доступ к базе данных SQLite в памяти - PullRequest
9 голосов
/ 16 июля 2010

У меня есть многопоточное приложение Linux C ++, которое нуждается в высокопроизводительном средстве поиска справочных данных. Я пытался использовать для этого базу данных SQLite в памяти, но не вижу способа добиться ее масштабирования в моей многопоточной среде.

Кажется, что режим потоков по умолчанию (сериализованный) страдает от одной крупнозернистой блокировки, даже когда все транзакции только для чтения. Более того, я не верю, что могу использовать многопоточный режим, потому что не могу создать несколько соединений с одной базой данных в памяти (потому что каждый вызов sqlite3_open (": memory:", & db) создает отдельную память базы данных).

Итак, я хочу знать: есть ли что-то, что я пропустил в документации, и можно иметь несколько потоков, имеющих общий доступ к одной и той же базе данных в памяти из моего приложения C ++.

В качестве альтернативы, есть ли альтернатива SQLite, которую я мог бы рассмотреть?

Ответы [ 2 ]

6 голосов
/ 02 октября 2012

Да! см. следующую выдержку из документации по адресу: http://www.sqlite.org/inmemorydb.html

Но это не прямое подключение к памяти БД, а к общему кешу. Это обходной путь. см. картинку.

Multiple connections to SQLite in-memory DB by shared cache

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

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

rc = sqlite3_open("file::memory:?cache=shared", &db);

Или

ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;

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

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

rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);

Или,

ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;

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

0 голосов
/ 16 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...