首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres /Postgres:连接随机挂起

Postgres /Postgres:连接随机挂起
EN

Stack Overflow用户
提问于 2010-11-13 15:09:54
回答 3查看 2.6K关注 0票数 3

我正在为我目前正在开发的cherrypy应用程序使用psycopg2和cli & phpgadmin来手动处理一些操作。下面是python代码:

代码语言:javascript
复制
#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日志中发现的唯一错误是,在终止应用程序之后:

代码语言:javascript
复制
...
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个线程。

有人知道我应该先去哪里吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-17 14:12:27

尽管我不知道为什么成功的SELECT查询会阻塞连接,但是在几乎每一个不需要与另一个查询一起工作的查询之后,.commit()就会溢出。

票数 0
EN

Stack Overflow用户

发布于 2016-10-19 22:23:00

Psycopg2需要在每个事务(包括SELECT查询)之后提交或回滚,否则就会使连接“空闲在事务中”。现在,这是文档中的一个警告:

警告:默认情况下,任何查询执行(包括简单的选择)都会启动事务:对于长期运行的程序,如果不采取进一步的操作,会话将保持“事务空闲”,这是一个不理想的条件,原因有几个(会话持有锁,表膨胀.)。对于长期存在的脚本,要么确保尽快终止事务,要么使用自动提交连接.

票数 2
EN

Stack Overflow用户

发布于 2010-11-14 04:42:18

很难准确地看到您正在填充和访问cherrypy.thread_data的位置。我建议您研究psycopg2.pool.ThreadedConnectionPool,而不是自己将一个conn绑定到每个线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4173168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档