Читатель и писатель процесс SQLite - PullRequest
1 голос
/ 25 февраля 2010

У меня есть два процесса:

  1. Пишет в две таблицы каждую секунду (ish)
  2. Периодически читает из указанных таблиц

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

Есть ли что-нибудь, что вы можете предложить, чтобы полностью устранить необходимость для этих двух процессов касаться одной и той же базы данных? Например, могу ли я атомарно перенести данные из записываемой базы данных во вторую доступную только для чтения базу данных?

Спасибо:)

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

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

sqlite3_busy_timeout(sqlite3*, int ms);

http://www.sqlite.org/c3ref/busy_timeout.html

0 голосов
/ 25 февраля 2010

Могу ли я предложить прочитать FAQ по SQLite безопасность потоков ?

Нити злые . Избегайте их.

SQLite является потокобезопасным. Мы идем на эту уступку, поскольку многие пользователи предпочитают игнорировать советы, данные в предыдущем абзаце. Но для поточной безопасности SQLite должен быть скомпилирован с макросом препроцессора SQLITE_THREADSAFE, установленным в 1.

...