我目前正在开发一个基于CherryPy的应用程序,并使用psycopg2进行开发。同时,我还使用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实例时都创建一个新的连接,但是我绝对不想这样做。
此外,我读到过,除非所有事务都被提交,否则可能会遇到类似的问题:我为每个单独的INSERT/UPDATE查询使用try/except块,但我从不为SELECT查询使用它,也不想编写更多的样板代码(顺便问一下,它们需要被提交吗?)。即使是这种情况,为什么phpgadmin会关闭呢?
在.conf文件中,max_connections设置为100,因此我不认为这是原因。单个cherrypy工作器只有10个线程。
有人知道我应该先查找哪里吗?