Я использую psycopg2 для приложения cherrypy, над которым я сейчас работаю, и cli & phpgadmin для обработки некоторых операций вручную. Вот код Python:
#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 (хотя я думаю, что последний более вероятен). После отправки нескольких запросов мои соединения оборвались. Точно так же 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, но я абсолютно не хочу этого делать.
Кроме того, я читал, что можно столкнуться с подобными проблемами, если не все транзакции зафиксированы: я использую блок try / исключением для каждого отдельного запроса INSERT / UPDATE, но я никогда не использую его для запросов SELECT и не хочу написать еще больше стандартного кода (кстати, они должны быть зафиксированы?). Даже если это так, почему phpgadmin закрывается?
max_connections установлено в 100 в файле .conf, поэтому я не думаю, что это тоже причина. Один вишневый рабочий имеет только 10 нитей.
У кого-нибудь есть идеи, куда мне в первую очередь смотреть?