Как синхронизировать с дисковой базой данных SQLite с PRAGMA synchronous = OFF

Мне нужна очень быстрая база данных SQLite. Установка параметров таким образом:

PRAGMA synchronize = OFF
PRAGMA jorunal_mode = MEMORY

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

Есть ли способ заставить SQLite записывать на диск все данные (ожидание в журнале памяти)?

Спасибо.

Ответ 1

Я предлагаю вам использовать недавно реализованный WAL journal_mode. Таким образом, вы можете оставить synchronous до normal и записать все записи, записанные на диск:

Записывать транзакции очень быстро, поскольку они включают только запись контента один раз (против дважды для транзакций с откатом-журналом) и потому что записи все последовательны. Кроме того, синхронизация содержимого с диск не требуется, если приложение желает долговечность после потери мощности или жесткой перезагрузки. (Writers синхронизировать WAL при каждой транзакции, если установлен PRAGMA синхронный для FULL, но опустите эту синхронизацию, если PRAGMA synchronous установлен на NORMAL.)

Вышеизложенное взято из:

http://www.sqlite.org/wal.html

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

http://www.sqlite.org/pragma.html#pragma_wal_checkpoint