Как избежать тайм-аутов заблокированных баз данных SQLite с помощью PHP / PDO - PullRequest
3 голосов
/ 24 мая 2011

В настоящее время я пытаюсь исправить проблему в очереди проблем ядра Drupal , связанную с тайм-аутами, возникающими, когда кто-то посещает сайт во время выполнения поисковой индексации, довольно трудоемкая операция, которая обычно происходит при вызове команды cron (так что вполне вероятно, что это произойдет на живом сайте, хотя все еще доступно для общественности). Это связано с блокировкой записи SQLite при записи, что, как правило, не является проблемой, но в данном случае это связано с тем, что выполнение такой индексации значительно увеличивает вероятность того, что для соединения истечет время ожидания в ожидании снятия блокировки.

Ответ, похоже, заключается в увеличении времени, в течение которого водитель ожидает разблокировки блокировки. В PHP это возможно сделать, установив опцию PDO::ATTR_TIMEOUT на количество секунд ожидания блокировки. Тем не менее, это не похоже на работу; тайм-ауты случаются независимо от того, какое значение они передают. Я не могу найти никаких упоминаний о том, что он не работает нигде в Интернете, так что, это только мы? Кто-нибудь еще сталкивался с проблемами при попытке увеличить время ожидания SQLite? Возможно, есть какой-то другой способ избежать этой проблемы?

Ответы [ 4 ]

1 голос
/ 01 декабря 2013

Существует только одно возможное решение -

$dbConnection->setAttribute(PDO_ATTR_TIMEOUT, (int)$time_in_seconds);

Не забывайте, что время в секундах: -)

1 голос
/ 02 февраля 2012

Можно ли войти в состояние только для чтения при выполнении индексации поиска?(только чтение лучше, чем тайм-ауты ...)

Если это так, я бы предложил сделать это так:

  • на уровне приложения (например, основной код drupal), заблокировать вседружественный способ записи запросов
  • копирование файла базы данных
  • выполнение индексации поиска для скопированного файла, основной файл не заблокирован
  • перезаписать основной файл с помощьюскопированный файл (удаление ненужного файла)
  • включить запросы на запись и вернуться в нормальное состояние
1 голос
/ 19 апреля 2013

PDO :: ATTR_TIMEOUT, похоже, игнорируется при совместном использовании двух следующих команд PRAGMA. Используйте один или другой сам по себе, и время ожидания работает, как ожидалось. Версия SQLite: 3.7.7.1

PRAGMA journal_mode=PERSIST
PRAGMA journal_mode=WAL

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

1 голос
/ 03 июня 2011

Мне удалось смягчить это с помощью

PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY; 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...