SQLite проблема - БД заблокирован обходной путь - PullRequest
1 голос
/ 05 февраля 2012

У меня есть 2 процесса, которые подключаются к одной и той же БД.Первый используется для чтения из БД, а второй - для записи в БД.Первый процесс отправляет процедуры записи для выполнения второму процессу через очередь сообщений в linux.

Каждый SQL-оператор берется в подпрограмме prepare, step, finalize;Там, где подготовка и этап выполняются в цикле 10000 раз, пока он не будет успешным (это было сделано для устранения проблем, связанных с БД).

Чтобы добавить таблицу, выполните следующую процедуру:

  1. первый процесс отправляет запрос через msg-q второму процессу, чтобы добавить таблицу и вставить мусор в ее строки в режиме journal_mode = OFF.

  2. , затем первый процесс проверяетдля существующей таблицы, чтобы она могла продолжить в своем алгоритме.(Он проверяет его в цикле с помощью команды usleep между итерациями.)

Проблема заключается в том, что второй процесс застревает в шаге выполнения 'PRAGMA journal_mode = OFF;'потому что он говорит, что БД заблокирована (здесь я также использую цикл из 10000 итераций с usleep, чтобы проверить 10000 раз для освобождения БД, как я упоминал ранее).

Когда я добавляю в первый процессв цикле «проверка существующей таблицы», операция закрытия соединения, второй процесс в порядке.Но теперь, когда я иногда добавляю таблицы и значения, я получаю «запрос на обратный вызов отменяется» в операторе шага.

Любая помощь в том, что здесь происходит?

1 Ответ

2 голосов
/ 07 февраля 2012

Использовать режим WAL. Это позволяет одному писателю и любому количеству читателей без проблем. Вам не нужно проверять заблокированное состояние, делать повторные попытки и т. Д.

WAL ограничение: БД должна быть на локальном диске.

Производительность: крупные транзакции (1000 вставок или аналогичные) медленнее, чем классический журнал отката, но, кроме этого, скорость очень похожа, а иногда даже лучше. Воспринимаемая производительность (пользовательский интерфейс ожидает завершения записи в БД) значительно улучшается.

WAL - это новая технология, но она уже используется в телефонах Firefox, Adroid / iOS и т. Д. Я провел тесты с двумя потоками, работающими на полной скорости - один записывал, а другой читал - и не столкнулся ни с одной проблемой.

Вы можете упростить свое приложение при переходе в режим WAL.

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