Pgbouncer - закрытие, потому что: unclean server на каждом соединении

Я запускаю Django 1.3 с PostgreSQL 9.1/PostGIS 1.5, psycopg2 2.4.2 и pgbouncer 1.4.2.

В каждом отдельном соединении с базой данных я получаю запись в журнале pgbouncer.log:

2011-11-20 02: 15: 25.027 29538 LOG S-0x96c2200: app_db/[email protected]: 5432 закрытие, потому что: unclean server (age = 0).

Я не могу найти решение этой проблемы - у кого-нибудь есть идея, почему? Я попытался переконфигурировать pgbouncer (сеанс/транзакционный режим, разные таймауты и т.д.), Но безрезультатно.

Ответ 1

Хорошо, я думаю, что понял это. Проблема заключается в давней проблеме с Django и Psycopg2. В принципе, Psycopg2 автоматически выдает инструкцию BEGIN в БД. Однако, если Django считает, что никаких изменений в данных не произошло, он не выдает COMMIT в конце транзакции.

Есть несколько решений этой проблемы, посмотрите на http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application для получения более подробной информации. В идеале вы отключите автоматические коммиты (установив autocommit = True в настройках вашего БД, неловкое соглашение об именах). Это предотвращает транзакции только для чтения, но также и для функций записи, поэтому вам необходимо вручную обернуть эти функции в декораторе @commit_on_success.

В качестве альтернативы просто добавьте django.middleware.transaction.TransactionMiddleware в свои классы промежуточного ПО. Это приведет к завершению каждого запроса в транзакции. Это означает также излишнюю упаковку запросов на чтение только в транзакции, но это быстрое и грязное решение.