我正在为我目前正在开发的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()我对心理医生或波斯特格雷斯都有意见(我认为后者更有可能)。在发送了几个查询之后,我的连接就停止了。类似地,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/ but块,但我从不将其用于SELECT查询,也不想编写更多的样板代码(顺便说一句,它们是否需要提交?)即使是这样,为什么phpgadmin会关闭呢?
max_connections在.conf文件中被设置为100,所以我认为这也不是原因。一个cherrypy工作线程只有10个线程。
有人知道我应该先去哪里吗?
发布于 2010-11-17 14:12:27
尽管我不知道为什么成功的SELECT查询会阻塞连接,但是在几乎每一个不需要与另一个查询一起工作的查询之后,.commit()就会溢出。
发布于 2016-10-19 22:23:00
Psycopg2需要在每个事务(包括SELECT查询)之后提交或回滚,否则就会使连接“空闲在事务中”。现在,这是文档中的一个警告:
警告:默认情况下,任何查询执行(包括简单的选择)都会启动事务:对于长期运行的程序,如果不采取进一步的操作,会话将保持“事务空闲”,这是一个不理想的条件,原因有几个(会话持有锁,表膨胀.)。对于长期存在的脚本,要么确保尽快终止事务,要么使用自动提交连接.
。
发布于 2010-11-14 04:42:18
很难准确地看到您正在填充和访问cherrypy.thread_data的位置。我建议您研究psycopg2.pool.ThreadedConnectionPool,而不是自己将一个conn绑定到每个线程。
https://stackoverflow.com/questions/4173168
复制相似问题