Как получить SQLITE для буфера вставок? - PullRequest
0 голосов
/ 04 января 2012

Я создаю транзакцию явно, используя SQLITE, то есть:

sqlite3_exec (дБ, "BEGIN", NULL, NULL, NULL);

сделать кучу вставок

sqlite3_exec (дБ, "END", NULL, NULL, NULL);

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

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

Я также замечаю, что иногда я не могу успешно выполнить оператор выбора в той же базе данных из другойпроцесс, и я подозреваю, что это может быть связано с моей стратегией использования транзакций.В этих случаях выбор завершается неудачно из-за состояния LOCK или BUSY на БД.

Кто-нибудь знает, как обрабатывать SQLITE вручную, чтобы буферизовать вставки для лучшей производительности?

Большое спасибо!

1 Ответ

1 голос
/ 04 января 2012

Транзакция удерживает SQLite от фиксации в файле базы данных до тех пор, пока транзакция не будет завершена (или откатана), но не мешает записи на диск, так как ей все еще необходимо обновить файл журнала.

Вы можете обойти это, используя базу данных в памяти, а затем записав базу данных в памяти в свою файловую базу данных.Дополнительная информация здесь: Базы данных в памяти

Кроме того, стандартная модель журнала SQLite поддерживает либо одного записывающего, либо нескольких читателей, но не обоих, поэтому вы получаете LOCK /Состояние занятости, когда вы пытаетесь выбрать.Чтобы обойти это, вы должны изучить использование метода журнала WAL вместо метода отката.Больше информации здесь: Запись с записью впереди

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