ФорумРазработкаБазы данных → SQLite и проблема блокировок

SQLite и проблема блокировок

  • shuranov

    Сообщения: 113 Репутация: N Группа: Кто попало

    Spritz 9 декабря 2010 г. 12:13

    Столкнулся с проблемой в разработке. Есть демон, который пишет некую информацию в SQLite базу данных с высокой частотой. Для избежания блокировок этой БД в процессе записи была организована очередь записи через AMQP сервер. Но SQLite блокируется даже на выборку, что мешает другому процессу периодически считывать накопленную информацию. Приходится делать в цикле несколько попыток чтения из БД, прежде чем она освободится для запроса.
    Вариант смены БД сейчас не рассматривается, хотя я на нем достаточно настаиваю. Посему вопрос, возможно ли изменить makefile (встречал упоминания того, что можно избавиться от блокировок на чтение путем изменения makefile при сборке, но детально ничего не нашел) так, чтобы запросы выборки не блокировались бы?
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 9 декабря 2010 г. 12:19, спустя 5 минут 50 секунд

    В смысле один читающий процесс блокирует другие читающие?
    В SQLite3 есть флаги в конструкторе: http://ru.php.net/manual/en/sqlite3.construct.php
  • shuranov

    Сообщения: 113 Репутация: N Группа: Кто попало

    Spritz 9 декабря 2010 г. 12:25, спустя 6 минут 1 секунду

    Не совсем, записывающий процесс блокирует читающий.
    То бишь:
    к демону подключается куча клиентов, сбрасывающих некоторую информацию. Демон помещает в Rabbit-MQ эту информацию. Другой процесс периодически обращается к очереди Rabbit-MQ и считывает задачи, которые последовательно пишутся в SQLite. То есть реализована такая очередь, чтобы исключить вариант одновременной записи в SQLite двух и более процессов.
    И есть еще процесс, который обрабатывает данные из БД, для этого ему надо с некоторой перидичностью (раз в 5-6 секунд) извлекать данные из БД. И вот тут-то этот процесс частенько обламывается. SQLite в момент записи блокирует все запросы на чтение. Приходится предпринимать несколько попыток чтения из БД в цикле, чтобы пробиться, что сказывается на общей скорости всей системы.
    Реализовано все на Perl.
    За флаги спасибо, пойду пороюсь с их установкой, может спасет.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 9 декабря 2010 г. 12:29, спустя 4 минуты 12 секунд

    А насколько длительны процессы чтения и записи? Раз в 5-6 секунд небольшая задержка не должна внести особого замедления.
    И разве при подключении, процесс не ждёт разблокировки?
  • shuranov

    Сообщения: 113 Репутация: N Группа: Кто попало

    Spritz 9 декабря 2010 г. 12:32, спустя 2 минуты 23 секунды

    Процессы записи и чтения краткие, но записей очень много, коннектов на демон может приходиться пока порядка 200 в секунду, позже, подозреваю, вырастет за 1000. Поэтому процесс записи работает без остановок практически.
    На подключении блокировки нет, можно подключиться в ручном режиме. Но и в ручном режиме при попытке сделать выборку, сообщается о том, что table is locked.

    Хм, для DBD::SQLite не нашел пока установки флагов. На си переписывать страшно не хочу.
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 9 декабря 2010 г. 12:32, спустя 34 секунды

    Я ещё делал извращённый вариант - две одинаковые базы, сначала в одну пишется, потом в другую, чтение только из той, которая свободна.
  • shuranov

    Сообщения: 113 Репутация: N Группа: Кто попало

    Spritz 9 декабря 2010 г. 12:33, спустя 1 минуту 1 секунду


    Я ещё делал извращённый вариант - две одинаковые базы, сначала в одну пишется, потом в другую, чтение только из той, которая свободна.

    Жизнеспособный вариант, вполне. Я подумаю, над распределением доступа по времени. Спасибо.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!