pgbouncer - закрытие, потому что: нечистый сервер при каждом соединении - PullRequest
10 голосов
/ 20 ноября 2011

Я использую 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/postgres@192.168.171.185: 5432 закрытие, поскольку: нечистый сервер (возраст = 0).

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

1 Ответ

16 голосов
/ 29 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...