Django, Ajax Long Olpalling, PostgreSQL: простоя транзакция
-
25-10-2019 - |
Вопрос
Я внедрил чат, используя Ajax Long Offilling и Gevent. Чтобы прочитать, клиент Ajax - обновление представления и подождите с Gevent.event.Vait для обновления.
Проблема: транзакция PostgreSQL, открытая Django в начале запроса (для получения информации о сеансе) не закрыта до конца запроса. И эти холостые транзакции занимают много памяти.
Какой будет самый чистый способ закрыть транзакцию PostgreSQL без закрытия запроса? В настоящее время я отправляю сигнал request_finiored вручную, но это похоже на взлом.
Решение
То, как вы это делаете, это, вероятно, лучший способ в рамках вашего взлома. Есть ли причина, по которой вы пытаетесь продолжить обувку, в процесс запроса ответа вместо использования чего-то подобного Django-Socketio?
Другие советы
Глянь сюда: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually
@transaction.commit_manually
def yourview(request):
# do your db actions
transaction.commit()
Или если вы предпочитаете контекстные менеджеры:
def yourview(request):
...
with transaction.commit_manually():
# do your db actions
...
Кроме того, если у вас есть проблемы с памятью, удерживающие открытые подключения PostgreSQL, вы должны искать решение для объединения с помощью PGBouncer или различных пулов подключений Gevent, которые существуют. Вы должны увидеть значительный результат производительности от этого.