Python / SQLite - база данных заблокирован несмотря на большие тайм-ауты

Я уверен, что пропускаю что-то довольно очевидное, но я не могу ни за что в жизни остановиться, мои pysqlite сценарии, отказывающие с базой данных, заблокированная ошибка. У меня есть два сценария, один для загрузки данных в базу данных, и один для чтения данных, но оба будет часто, и немедленно, катастрофический отказ в зависимости от того, что другой делает с базой данных в любой момент времени. У меня есть тайм-аут на обоих наборах сценариев к 30 секундам:

cx = sqlite.connect("database.sql", timeout=30.0)

И думайте, что я вижу некоторое доказательство тайм-аутов в этом, я получаю то, что, кажется, штамп синхронизации (например, 0.12343827e-06 0.1 - и как я останавливаю то, чтобы это было распечатанным?) выводимый иногда посреди моего экрана отформатированного вывода Проклятий, но никакой задержки, которая когда-либо добирается удаленно около 30 вторых тайм-аутов, но тем не менее один из другого продолжает отказывать снова и снова от этого. Я выполняю RHEL 5.4 на 64-разрядных 4 блейдах ЦП HS21 IBM и услышал некоторое упоминание о проблемах о многопоточности, и не уверено, могло ли это быть релевантно. Используемые пакеты являются sqlite-3.3.6-5, и python-sqlite-1.1.7-1.2.1, и обновляющий до более новых версий за пределами официальных условий Red Hat не является большой опцией для меня. Возможный, но не желательный из-за среды в целом.

Я имел autocommit=1 на ранее в обоих сценариях, но с тех пор отключили на обоих, и я теперь cx.commit()луг на сценарии вставки и не фиксация на избранном сценарии. В конечном счете, поскольку у меня только когда-либо есть один сценарий, на самом деле делающий любые модификации, я действительно не вижу, почему эта блокировка должна когда-либо происходить. Я заметил, что это значительно хуже со временем, когда база данных стала больше. Недавно на уровне 13 МБ с 3 равными размерными таблицами, была ценность приблизительно 1 дня данных. Создание нового файла значительно улучшило это, которое кажется понятным, но тайм-ауту в конечном счете просто, кажется, не повинуются.

Любые указатели очень ценятся.

Править: начиная с выяснения я смог реструктурировать свой код немного и использовать сигнал периодически писать между 0 и 150 обновлениями в одной транзакции каждые 5 секунд. Это значительно уменьшило случаи блокировки меньше чем к одному час в противоположность один раз в минуту или около этого. Я предполагаю, что мог пойти далее путем обеспечения времен, я пишу, что данные смещаются на несколько секунд, когда я считал данные в другом сценарии, но существенно я работаю вокруг проблемы, поскольку я чувствую его, делая тайм-аут не требуемым, который не кажется правильным все еще. Ta.

7
задан Peter Mortensen 12 May 2010 в 20:56
поделиться

2 ответа

SQLite использует блокировку базы данных для каждой записи (update/insert/delete/...). ИМХО, эта блокировка удерживается до завершения транзакции. Это единственная блокировка, удерживаемая во всех потоках/процессах, AFAIK.

Итак, я бы попробовал явно завершить транзакцию и соединение для написания скрипта и явно зафиксировать даже при чтении скрипта и попытаться отладить проблемы параллелизма.

0
ответ дан 7 December 2019 в 14:30
поделиться

SQLite просто не оптимизирован для работы с большими объемами записи и не претендует на это (но он не возражает против записи достаточно большого объема в одной транзакции). Мне кажется, что вам пора переходить на другую базу данных, например, MySQL, PostgreSQL, Oracle или DB2. Некоторые из этих вариантов действительно дороги, но для некоторых рабочих нагрузок это то, что вам нужно. (Также обратите внимание, что для тяжелых рабочих нагрузок, связанных с записью, лучше использовать выделенные серверы баз данных, несмотря на то, что это увеличивает стоимость и сложность развертывания. Некоторые вещи просто стоят.)

.
1
ответ дан 7 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: