2015-07-21 3 views
1

Я боролся с «базы данных sqlite3.OperationalError заблокирован» весь день ....базы данных SQLite Джанго заблокирован

Поиск вокруг ответов на то, что, как представляется, хорошо известная проблема, я обнаружил, что это объясняется в большинстве случаев тем фактом, что sqlite не работает очень хорошо в многопоточности, где поток может потенциально затягиваться, ожидая более 5 (по умолчанию тайм-аута) секунд для записи в db, потому что другой поток имеет блокировку db.

Итак, имея больше потоков, которые играют с db, один из них использует транзакции и часто пишет, я начал измерять время, необходимое для завершения транзакций. Я обнаружил, что никакая транзакция занимает более 300 мс, что делает невозможным вышеупомянутую экспликацию. Если поток, который использует транзакции, совершает последовательные транзакции ~ 21 (5000 мс/300 мс), в то время как любой другой поток, желающий писать, все это время игнорируется.

Итак, какая другая гипотеза может объяснить это поведение?

+0

нить держит соединение дб жив в то время как другой поток пытается написать ему ... все ваши записи должны быть сделаны в одном потоке –

+0

, к сожалению, есть некоторые фоновые задачи, которые играют с db. Когда транзакция завершена, не закрывается ли ее соединение?, Чтобы другие потоки могли получить возможность писать? – steve

+0

вы должны обрабатывать все свои транзакции db в одном потоке ... есть много «в теории», он должен работать, но на самом деле sqlite не был разработан с одновременным соединением в виду и, как таковой, имеет очень плохую поддержку ... альтернативно использовать база данных, которая знает о параллельных соединениях (mysql/postgres/mongo/etc) –

ответ

4

У меня было много таких проблем с Sqlite раньше. В принципе, у нет нескольких потоков, которые могли бы потенциально записываться в db. Если вам это не подходит, вам следует переключиться на Postgres или что-то еще, что лучше на параллелизм.

Sqlite имеет очень простую реализацию, основанную на файловой системе для блокировки. Большинство файловых систем не построены для таких операций с малой задержкой. Это особенно актуально для файловых систем, подключенных к сети, и виртуальных файловых систем, используемых некоторыми решениями VPS (последний из них получил BTW).

Кроме того, вы также располагаете слоем Django поверх всего этого, добавляя сложность. Вы не знаете, когда Django выпускает соединения (хотя я уверен, что кто-то здесь может дать этот ответ подробно :)). Но опять же, если у вас есть несколько параллельных авторов, вам необходимо уровень базы данных, чем для параллелизма. Период.

Я решил эту проблему, переключившись на postgres. Django делает это очень просто для вас, даже перенос данных без проблем с очень небольшим временем простоя.

+0

, это прекрасный ответ на этот вопрос imho –

Смежные вопросы