Вопрос

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

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

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

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

Спасибо :)

Это было полезно?

Решение

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

sqlite3_busy_timeout(sqlite3*, int ms);

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

Другие советы

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

Нити - это зло.Избегайте их.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top