Вопрос по sqlite – Могу ли я читать и записывать в базу данных SQLite одновременно из нескольких соединений?

56

У меня есть база данных SQLite, которая используется двумя процессами. Мне интересно, с самой последней версией SQLite, в то время как один процесс (соединение) запускает транзакцию для записи в базу данных, сможет ли другой процесс одновременно считывать данные из базы данных?

связанный вопрос смотрите здесь ..stackoverflow.com/questions/12117016/… Xar E Ahmer

Ваш Ответ

2   ответа
101

в основном из sqlite.org, и собрал их вместе:

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

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

Начиная с версии 3.7.0, новая& # x201C; Запись в журнал впереди & # x201D; (WAL) доступна опция, при которой чтение и запись могут выполняться одновременно.

По умолчанию WAL не включен. Чтобы включить WAL, обратитесь к документации по SQLite.

так что гипотетически, если вам нужно было решить проблему, когда вы хотели получить данные локально, не делая их доступными для широкой публики, но имея возможность записывать несколько файлов параллельно, вам потребуется один файл базы данных для каждой записи, чтобы одновременная запись нескольких записей могла происходить. это? Я знаю, что несколько файлов обычно осуждаются, но я пытаюсь найти способ сделать несколько записей из задачи сельдерея без использования базы данных на стороне сервера, поскольку мне нужны данные только для локальных вычислений
journal_mode = WAL решает мою проблему!
14

несколько соединений:

(5) Can multiple applications or multiple instances of the same application access a single database file at the same time?

Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.

Для обмена подключениями используйтеОбщий кэш SQLite3:

Starting with version 3.3.0, SQLite includes a special "shared-cache" mode (disabled by default)

In version 3.5.0, shared-cache mode was modified so that the same cache can be shared across an entire process rather than just within a single thread.

5.0 Enabling Shared-Cache Mode

Shared-cache mode is enabled on a per-process basis. Using the C interface, the following API can be used to globally enable or disable shared-cache mode:

int sqlite3_enable_shared_cache(int);

Each call sqlite3_enable_shared_cache() effects subsequent database connections created using sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2(). Database connections that already exist are unaffected. Each call to sqlite3_enable_shared_cache() overrides all previous calls within the same process.

Похожие вопросы