Блокировка PDO Sqlite с несколькими записями - PullRequest
0 голосов
/ 10 августа 2011

Я делаю простой класс регистрации, который записывает сообщения в базу данных sqlite с использованием расширения pdo в php.Он регистрируется правильно, но периодически медленно.Когда я загружаю страницу, она быстро регистрируется, но если вторая страница загружается почти одновременно, она иногда зависает.

Глядя на профиль из XDEBUG, похоже, что операторы prepare и execute иногда принимаюточень мало времени, но иногда занимает больше времени.Когда они длиннее, они всегда очень близки к кратному секунды (например, 1000, 1001 или 2001 миллисекунд).

Я пробовал разные комбинации использования начала транзакции или нет и PDO :: ATTR_PERSISTENT.

Есть предложения?

1 Ответ

1 голос
/ 10 августа 2011

Это главный недостаток SQLite.

Базы данных имеют механизм блокировки , чтобы предотвратить изменение данных / схемы во время выполнения запроса. Большинство серверов баз данных будут работать в ОЗУ, после чего данные будут сохраняться на диск в поточном режиме (т.е. записывать в ОЗУ, возвращать ответ, затем записывать на диск). Вы уже должны знать, что запись в память в газиллион раз быстрее, чем запись на диск. Поскольку SQLite выполняет запись непосредственно на диск, он сначала блокирует базу данных, записывает, а затем снимает блокировку. Запись (на диск) занимает намного больше времени, чем на обычном сервере баз данных (например, MySQL, PostgreSQL и т. Д.), Что приводит к длительному времени отклика при выполнении нескольких запросов с небольшой задержкой.

Решение, которое я нашел, состоит в том, чтобы использовать базу данных памяти (то есть: :memory:) и регулярно выгружать на диск. Основным недостатком этого подхода является то, что данные на диске не обязательно в курсе последних данных (поскольку фактические данные в реальном времени хранятся в памяти).

Волшебного решения не существует, это коренная «проблема» SQLite. Если вы планируете запускать несколько одновременных операций записи в базу данных, вам следует подумать об использовании реального сервера базы данных.

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