pgbouncer-закрытие, потому что: нечистый сервер на каждом соединении


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

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

2011-11-20 02:15:25.027 29538 журнал S-0x96c2200: app_db/postgres@192.168.171.185:5432 закрытие потому что: нечистый сервер (Возраст=0).

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

1 10

1 ответ:

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

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

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