2011-11-20 21 views
10

我使用PostgreSQL 9.1/PostGIS 1.5運行Django 1.3,psycopg2 2.4.2和pgbouncer 1.4.2。pgbouncer - 關閉因爲:在每個連接上的不潔服務器

到數據庫我得到pgbouncer.log日誌條目的每一個連接:

2011-11-20 02:15:25.027 29538 LOG S-0x96c2200:app_db/[email protected] :5432關閉因爲:不潔服務器(年齡= 0)。

我找不到解決這個問題的辦法 - 有人有個想法,爲什麼?我試過重新配置pgbouncer(會話/交易模式,不同的超時等),但無濟於事。

回答

15

好吧,我想我已經明白了這一點。問題在於Django和Psycopg2長期存在的問題。基本上,Psycopg2會自動向DB發佈BEGIN語句。但是,如果Django認爲沒有發生數據修改,它不會在事務結束時發出COMMIT。

這個問題有幾個解決方案,請看http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application瞭解更多細節。理想情況下,關閉自動提交(通過在數據庫設置中設置autocommit = True,命名約定尷尬)。這樣可以防止只讀函數上的事務,也可以防止寫函數上的事務,因此您需要手動將這些函數包裝在@commit_on_success修飾器中。

或者,只需將django.middleware.transaction.TransactionMiddleware添加到您的中間件類。這將在事務中包裝每個請求。這也意味着不必要地將只讀請求包裝在一個事務中,但這是一個快速而骯髒的解決方案。

+0

好吧,剛剛發現了困難的方式,警告:如果您使用芹菜(或其他)進行後臺任務處理,請不要這樣做。可能會出現競爭條件,將對象的主鍵傳遞給運行異步的任務。該任務可以在請求完成(並且提交事務)之前開始運行,因此任務無法找到該對象。我認爲唯一的解決方案是手動事務管理。 – Dick

+1

只是一個說謝謝連接到我的演示文稿...我很高興它是有用的! :) – Christophe

+0

當然!這是一個很棒的介紹;對於Django中「破壞」的事務管理知之甚少,我感到驚訝。 – Dick

相關問題