Psycopg/Postgres:随机连接

2024-10-01 17:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我将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日志中发现的唯一错误是:

^{pr2}$

我想在每次创建一个新的dbobj实例时创建一个新的连接,但是我不想这样做。在

另外,我还读到,除非提交了所有事务,否则可能会遇到类似的问题:我对每个INSERT/UPDATE查询都使用try/except块,但我从不将其用于SELECT查询,也不想编写更多的样板代码(顺便说一句,需要提交它们吗?)。即使是这样,为什么phpgadmin会关闭?在

max_connections在.conf文件中设置为100,所以我也不认为这是原因。一个cherrypy工人只有10个线程。在

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


Tags: 代码self应用程序dataobjectisdefconnection
3条回答

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

Psycopg2需要在每个事务(包括SELECT查询)之后进行提交或回滚,否则会使连接“在事务中处于空闲状态”。以下是文档中的警告:

Warning: By default, any query execution, including a simple SELECT will start a transaction: for long-running programs, if no further action is taken, the session will remain “idle in transaction”, an undesirable condition for several reasons (locks are held by the session, tables bloat...). For long lived scripts, either ensure to terminate a transaction as soon as possible or use an autocommit connection.

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

相关问题 更多 >

    热门问题