Что вызывает создание файла журнала в SQLite?
Я начал замечать странное поведение с моими запросами SQLite для моего iPhone-приложения. Всякий раз, когда я выполняю инструкцию "INSERT", файл журнала создается рядом с моим файлом db (точное имя файла "userdata.db-journal" ).
Если я правильно понимаю документы, этот файл журнала используется SQLite, чтобы иметь возможность отката в случае сбоя операции. Но файл остается там после завершения операции.
Я делаю классические шаги для подготовки, привязки и выполнения запроса (для простоты нет проверок для возвращаемых значений):
sqlite3 *db = NULL;
sqlite3_open( "userdata.db", &db );
sqlite3_stmt *insertStmt = NULL;
const char *query = "INSERT INTO table VALUES(?,?)";
sqlite3_prepare_v2( db, query, -1, &insertStmt, NULL );
sqlite3_bind_int( insertStmt, 1, 0 );
sqlite3_bind_int( insertStmt, 2, 0 );
sqlite3_step( insertStmt );
sqlite3_reset( insertStmt );
sqlite3_clear_bindings( insertStmt );
sqlite3_close( db );
Файл журнала создается после вызова функции "sqlite3_step" и остается там до тех пор, пока я не закрою db. Что мне нужно сделать, чтобы оно исчезло?
Ответы
Ответ 1
SQLite по умолчанию создает файл журнала в начале транзакции, что хорошо. Обычно он удаляет файл при фиксации.
Вы можете изменить это поведение, чтобы просто обрезать файл (без необходимости создания/удаления) или его обнулить, используя команду PRAGMA sql. Не все опции могут поддерживаться в вашей версии SQLite.
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF
Операции записи обычно не завершаются до тех пор, пока вы не выполните COMMIT, которая выполняется путем усечения, удаления или аннулирования журнала.
Если это поведение является новым, у меня нет объяснений, почему он мог измениться, кроме того, что обновление SQLite изменило поведение по умолчанию или стало более сложным, не открывая журнал для каждой транзакции.
Ответ 2
Почему вы хотите?
Файл журнала отслеживает каждую транзакцию в базе данных; вы хотите, чтобы он зависал до закрытия базы данных, чтобы состояние БД можно было восстановить после сбоя, даже если буферы записи не были сброшены и т.д.
Ответ 3
Как сказал Джо, журнал создается при запуске транзакции, и SQLlite создает его для вас при запуске оператора.
Чтобы очистить этот журнал и убедиться, что оператор был привязан к использованию db:
sqlite3_finalize(insertStmt);
Перед закрытием.
Файл .journal исчезнет, и все ваши данные будут приятными и безопасными в вашей БД.
Надеюсь, что это поможет.
Крис.