我正在使用psycopg2作爲我正在處理的cherrypy應用程序,並且clog & phpgadmin可以手動處理某些操作。這裏的Python代碼:Psycopg/Postgres:連接隨機掛出
#One connection per thread
cherrypy.thread_data.pgconn = psycopg2.connect("...")
...
#Later, an object is created by a thread :
class dbobj(object):
def __init__(self):
self.connection=cherrypy.thread_data.pgconn
self.curs=self.connection.cursor(cursor_factory=psycopg2.extras.DictCursor)
...
#Then,
try:
blabla
self.curs.execute(...)
self.connection.commit()
except:
self.connection.rollback()
lalala
...
#Finally, the destructor is called :
def __del__(self):
self.curs.close()
我在與任何psycopg或者Postgres的一個問題(altough我認爲後者的可能性更大)。在發送了幾個查詢後,我的連接就完蛋了。同樣,phpgadmin - 通常也會被丟棄;它提示我在多次提出請求後重新連接。只有CLI保持不變。
問題是,這些都是非常隨機發生的,我甚至無法找到原因。我可以在幾頁請求後鎖定,或者在請求數百頁之後從未真正遇到任何問題。我在Postgres裏發現的唯一的錯誤日誌,之後終止應用程序是:
...
LOG: unexpected EOF on client connection
LOG: could not send data to client: Broken pipe
LOG: unexpected EOF on client connection
...
我想每一個新dbobj實例被創建時創建一個新的連接,但我絕對不想做這個。
另外,我讀過一個可能遇到類似的問題,除非所有的事務都提交了:我對每一個INSERT/UPDATE查詢都使用try/except塊,但是我從來沒有用過它作爲SELECT查詢,我也不想寫更多的樣板代碼(順便說一句,他們需要承諾嗎?)。即便如此,爲什麼phpgadmin會關閉?
max_connections在.conf文件中設置爲100,所以我不認爲這也是原因。一個櫻桃工人只有10個線程。
有沒有人有一個想法,我應該先看看?