PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

pgbouncer - fechando porque:servidor sujo em todas as conexões


Ok, acho que descobri isso. O problema está em um problema de longa data com o Django e o Psycopg2. Basicamente, o Psycopg2 emitirá automaticamente uma instrução BEGIN para o banco de dados. No entanto, se o Django achar que nenhuma modificação de dados ocorreu, ele não emitirá um COMMIT no final de uma transação.

Existem algumas soluções para este problema, veja http://www. slideshare.net/OReillyOSCON/unbreaking-your-django-application para mais detalhes. Idealmente, você desativa os commits automáticos (definindo autocommit =True em suas configurações de banco de dados, convenção de nomenclatura estranha). Isso evita transações em funções somente leitura, mas também em funções de gravação, então você precisa encapsular manualmente essas funções em um decorador @commit_on_success.

Como alternativa, basta adicionar o django.middleware.transaction.TransactionMiddleware às suas classes Middleware. Isso envolverá todas as solicitações em uma transação. Isso significa também envolver desnecessariamente solicitações somente leitura em uma transação, mas é uma solução rápida e suja.