Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 25 Май, 2012, 06:18:35

Страниц: [1]
Печать
Автор Тема: SQLite и проблема блокировок  (Прочитано 519 раз)
0 Пользователей и 1 Гость смотрят эту тему.
shuranov    ↓ 
09 Декабрь, 2010, 12:13:36
НЕ ХУЕТА! ХУЕТА!


Карма: 7
Сообщений: 112
Сила слова: 6.25

Столкнулся с проблемой в разработке. Есть демон, который пишет некую информацию в SQLite базу данных с высокой частотой. Для избежания блокировок этой БД в процессе записи была организована очередь записи через AMQP сервер. Но SQLite блокируется даже на выборку, что мешает другому процессу периодически считывать накопленную информацию. Приходится делать в цикле несколько попыток чтения из БД, прежде чем она освободится для запроса.
Вариант смены БД сейчас не рассматривается, хотя я на нем достаточно настаиваю. Посему вопрос, возможно ли изменить makefile (встречал упоминания того, что можно избавиться от блокировок на чтение путем изменения makefile при сборке, но детально ничего не нашел) так, чтобы запросы выборки не блокировались бы?
Записан
vasa_c    ↓ 
09 Декабрь, 2010, 12:19:26 , спустя 5 минут 50 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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

shuranov    ↓ 
09 Декабрь, 2010, 12:25:27 , спустя 6 минут 1 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 7
Сообщений: 112
Сила слова: 6.25

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

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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

shuranov    ↓ 
09 Декабрь, 2010, 12:32:02 , спустя 2 минуты 23 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 7
Сообщений: 112
Сила слова: 6.25

Процессы записи и чтения краткие, но записей очень много, коннектов на демон может приходиться пока порядка 200 в секунду, позже, подозреваю, вырастет за 1000. Поэтому процесс записи работает без остановок практически.
На подключении блокировки нет, можно подключиться в ручном режиме. Но и в ручном режиме при попытке сделать выборку, сообщается о том, что table is locked.
 
Хм, для DBD::SQLite не нашел пока установки флагов. На си переписывать страшно не хочу.
Записан
vasa_c    ↓ 
09 Декабрь, 2010, 12:32:36 , спустя 34 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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

shuranov    ↓ 
09 Декабрь, 2010, 12:33:37 , спустя 1 минуту 1 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 7
Сообщений: 112
Сила слова: 6.25


Я ещё делал извращённый вариант - две одинаковые базы, сначала в одну пишется, потом в другую, чтение только из той, которая свободна.
Жизнеспособный вариант, вполне. Я подумаю, над распределением доступа по времени. Спасибо.
Записан
Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd