powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос по однобокости блокировки базы
5 сообщений из 5, страница 1 из 1
Вопрос по однобокости блокировки базы
    #38139211
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Может быть в форум по PHP надо было постить, но мне кажется, что недопонимаю особенности SQLite.

Для малюсенького проектика SQLite выбрал из-за удобства переносимости и малого (три таблицы, суммарно окло 1500) количества записей. Сразу скажу, что это мой первый опыт разработки с использованием данной СУБД.

В проекте есть скрипт (PHP, подключается к базе через PDO), запущенный в консоли постоянно. Значительную часть времени он "спит", просыпаясь каждые 5...15 минут для работы на 2...3 минуты и делает SELECT/INSERT/UPDATE - за весь цикл порядка 10 запросов. Есть еще небольшая веб-морда (тоже PHP+PDO), через которую правятся две таблицы из трех. По сути, это получается два клиентских подключения к БД. На данный момент использую SQLite версии 3.7.15.2, PHP 5.3.18, если это имеет значение.

Суть проблемы изначально была в блокировке БД. Если на момент сохранения данных из веб-интерфейса работает консольный скрипт, тогда скрипт веб-морды срубится по таймауту. Видимо, ждет снятия блокировки. И, наоборот, если недавно было сохранение данных из вебморды, то консольный скрипт вываливает ексепшн " SQLSTATE[HY000]: General error: 5 database is locked " при отработке запроса в транзакции. Пытаюсь обеспечить более-менее приличную "отзывчивость" скрипта веб-интерфейса. Пробовал выполнить запросы " PRAGMA journal_mode=WAL;PRAGMA synchronous = NORMAL; ", как советуют на форумах - получилось. Частично. Скрипт веб-интерфейса стал отрабатывать нормально. Однако, в консольном по-прежнему некоторое время ексепшн после обращения из веб-скрипта...

Почему получилась такая "несимметрия", куда смотреть, на что обратить внимание...? Структура скриптов в части UPDATE на данный момент практически одинакова в обоих случаях и выглядит примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
        try {
            $db->beginTransaction();
            $sth = $db->prepare("UPDATE .... SET .... WHERE ....");
            $sth->execute(array($var1, ... $varN)); // тут одна строка, но в реале несколько execute в цикле 
            $db->commit();
        } catch (PDOException $e) {
            echo $e->getMessage();
            $db->rollBack();
        }

Есть еще SELECT'ы-одиночки без транзакций.

В принципе, спешки в работе консольного скрипта нет, могу отловить ексепшн и подождать минуту-другую. Однако, хочется понять суть происходящего и свои ошибки.

Заранее благодарю.

PS: Предложения переехать на мускуль/постгри/прочее не годятся.
...
Рейтинг: 0 / 0
Вопрос по однобокости блокировки базы
    #38139256
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleВ проекте есть скрипт (PHP, подключается к базе через PDO), запущенный в консоли постоянно. Значительную часть времени он "спит", просыпаясь каждые 5...15 минут для работы на 2...3 минуты и делает SELECT/INSERT/UPDATE - за весь цикл порядка 10 запросов.Не нравится мне это время. Десять запросов на полутора тысяч записей должны отрабатывать за миллисекунды. Две-три минуты это ого-го-го и ой-ёй-ёй. Это первое место где надо искать таймауты.

vkle Есть еще небольшая веб-морда (тоже PHP+PDO), через которую правятся две таблицы из трех. По сути, это получается два клиентских подключения к БД. На данный момент использую SQLite версии 3.7.15.2, PHP 5.3.18, если это имеет значение.Если админский скрипт написан на том же PHP что и веб, то нет.
...
Рейтинг: 0 / 0
Вопрос по однобокости блокировки базы
    #38139326
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДве-три минуты это ого-го-го и ой-ёй-ёй.Не совсем так :) Ну, кроме запросов к БД скрипт еще и основной работой занят. Из базы берет задание, долго обрабатывает, пишет в базу результат, берет следующее. Обработал так пяток заданий - уснул минут на 15 до следующей порции. Таков основной цикл.
White Owlvkle Есть еще небольшая веб-морда (тоже PHP+PDO), через которую правятся две таблицы из трех. По сути, это получается два клиентских подключения к БД. На данный момент использую SQLite версии 3.7.15.2, PHP 5.3.18, если это имеет значение.Если админский скрипт написан на том же PHP что и веб, то нет.В смысле, не имеет значения, или не два подключения?
...
Рейтинг: 0 / 0
Вопрос по однобокости блокировки базы
    #38141007
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleWhite OwlДве-три минуты это ого-го-го и ой-ёй-ёй.Не совсем так :) Ну, кроме запросов к БД скрипт еще и основной работой занят. Из базы берет задание, долго обрабатывает, пишет в базу результат, берет следующее. Обработал так пяток заданий - уснул минут на 15 до следующей порции. Таков основной цикл.Рви связь в промежутке. Подключился, прочитал параметры задания, отключился, выполнил задание, подключился, обновил лог, отключился.
У тебя все признаки монопольного доступа к базе, а значит старайся сокращать периоды активной работы с базой для всех клиентов до минимума.

vkleWhite OwlЕсли админский скрипт написан на том же PHP что и веб, то нет.В смысле, не имеет значения, или не два подключения?В смысле версия PHP не имеет значения. Другое дело что версия SQLite внутри PHP почти никогда не совпадает с версией SQLite установленной в системе это уже другой разговор, но если ты всю работу с базой делаешь из одного и того-же php - то проблем версий не будет.
Ну а два отдельных подключения для двух отдельных скриптов у тебя будет конечно.
...
Рейтинг: 0 / 0
Вопрос по однобокости блокировки базы
    #38142516
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlРви связь в промежутке.Благодарю за подробное описание. В общем то, прихожу именно к этому выводу. Видимо, другие способы в моем случае не очень то приемлемы для надежной работы.

И, вот еще вопросик.
Правильно ли я думаю, что если типовое максимальное время работы скрипта от коннекта до дисконнекта будет, скажем, пол-секунды, то одной-двух секунд для sqlite_busy_timeout , которое устанавливаю сразу просле коннекта, будет вполне достаточно? Как я понял, по дефолту PHP ставит таймаут в 60 секунд, судя по этой доке . Для моего случая с PDO то ли искал плохо, то ли оно идентично... Смысл такой, чтоб если при запросе от какой-то стороны возникнут какие-то коллизии, то поймать ексепшн и быстренько отдать сообщение об ошибке (а не ждать всю минуту). Или у SQLite могут быть какие-то ощутимые внутренние потребности в исключительной блокировке?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос по однобокости блокировки базы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]