我将 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 实例时,我都想创建一个新连接,但我绝对不想这样做。
另外,我读到除非所有事务都已提交,否则可能会遇到类似问题:我对每个 INSERT/UPDATE 查询都使用 try/except 块,但我从不将它用于 SELECT 查询,也不想写更多样板代码(顺便说一句,它们是否需要提交?)。即使是这样,为什么 phpgadmin 会关闭?
max_connections 在 .conf 文件中设置为 100,所以我认为这也不是原因。一个cherrypy worker只有10个线程。
有谁知道我应该先看哪里?