Django.db.utils.OperationalError: база данных заблокирована даже при одновременном использовании приложения двумя пользователями

Я знаю, что это обычный вопрос, но мне нужно что-то другое. Можно ли решить эту ошибку без изменения типа базы данных? Я использую sqlite3, и когда 2 пользователя используют приложение, возникает эта ошибка. Я думаю, что ошибка может быть вызвана тем, что соединение не закрыто для пользователя. Есть ли способ закрыть курсор cursor.close() вручную в django?

этот код закрывает соединения с базой данных

from django import db
db.connections.close_all()

db.connections.close_all() этот код закрывает соединение для всех пользователей или есть способ закрыть соединение для вошедшего пользователя, как db.connections.close_all(request.user). Если есть способ закрыть соединение, то я могу поместить эту строку кода в начало любой функции, которая создает соединения с базой данных внутри нее.

Я использую PythonAnywhere для размещения своего приложения. Когда возникает эта ошибка django.db.utils.OperationalError: database is locked в логах сервера на PythonAnywhere отображается:

2022-02-02 04:42:18 SIGINT/SIGQUIT received...killing workers...
2022-02-02 04:42:19 worker 1 buried after 1 seconds
2022-02-02 04:42:19 worker 2 buried after 1 seconds
2022-02-02 04:42:19 goodbye to uWSGI.

Посмотрите здесь https://stackoverflow.com/a/3172950/9070282.

SQLite задуман как легкая база данных, и поэтому не может поддерживать высокий уровень параллелизма. Ошибки OperationalError: база данных заблокирована указывают на то, что ваше приложение испытывает больший параллелизм, чем sqlite может обрабатывать в конфигурации по умолчанию. Эта ошибка означает, что один поток или процесс имеет эксклюзивную блокировку на соединение с базой данных, а другой поток ожидает освобождения блокировки.

.

Обертка SQLite в Python имеет значение таймаута по умолчанию, которое определяет как долго второму потоку разрешается ждать блокировку, прежде чем он и выдать ошибку OperationalError: database is locked.

Если вы получаете эту ошибку, вы можете решить ее следующим образом:

Переключиться на другой бэкенд базы данных. В определенный момент SQLite становится слишком "легким" для реальных приложений, и такого рода ошибки параллелизма указывают на то, что вы достигли этой точки. Перепишите ваш код для уменьшения параллелизма и обеспечения того, чтобы транзакции с базой данных были недолговечны. Увеличьте значение таймаута по умолчанию, установив параметр timeout database option

enter image description here

Вернуться на верх