PostgreSQL + Python:关闭连接



我用Python做了一个游戏服务器,它使用psycopg2连接到PostgreSQL数据库。我看过一些例子,我看到当创建与数据库的连接时,应该在完成查询后关闭连接,例如对于每个客户端:

#create connection to db
con = psycopg2.connect (database = 'testdb', user = 'janbodnar')
cur = con.cursor ()
#process query
.
.
.
#close connection
con.close ()

好的,当我启动服务器时,我有这个:

我的班级内部

def __init __ (self):
      #create connection to db
      con = psycopg2.connect (database = 'testdb', user = 'janbodnar')
      cur = con.cursor ()
# to all customers ...
def query(self):
      #process query, for example ...
      cur.execute ("DROP TABLE IF EXISTS Cars")
      #the connection never closes

也就是说,我对来自所有客户的所有查询使用相同的连接对象,并且从不关闭连接,这看起来比为每个客户端打开和关闭连接更好,我的服务器显然运行良好。 你想到这个?这干得好?不做?。谢谢

@Micha ł Niklas 感谢您的回答,并感谢您的更正 self.con 和 self.cur,我忘了放"self"。

我澄清一下,我对服务器和数据库知之甚少。

我打算这样做:

我的服务器为每个用户处理"线程"单独的进程,然后,在每个单独的进程中,考虑为客户查询打开一个连接,然后关闭此连接,如下所示:

在我的课堂上:如果来自客户端 1 的新请求...此客户端的"线程",然后,查询运行...

def query (self):
       #create connection to db for client1
       con = psycopg2.connect (database = 'testdb', user = 'janbodnar')
       cur = con.cursor ()
       #process query for client1, for example ...
       cur.execute ("DROP TABLE IF EXISTS Cars")
       #close connection for this client
       con.close ()

他们对此有何看法?在我看来更好。我感谢建议和支持。

这可能有效,但不好。问题:如何设置会话的日期时间格式?如何处理交易?临时表?如何处理错误?另请参阅:如何使用 psycopg 和 gevent 池化连接?

对于此类操作,您可以使用连接池。这样,当您开始使用新客户端(新网络连接)时,您可以从池中获得数据库连接。使用它而不是关闭连接后,您释放它并返回到池中。现在它可能被其他线程使用。

如果您的连接以某种方式断开,则可能只是简单地关闭而不是返回到池。每个线程都可以使用事务,您可以更改会话设置,例如日期时间格式。

我看到有 https://www.psycopg.org/docs/pool.html

PS在您的方法中,您应该使用self.conself.cur

我认为

答案很简单:只要同时连接的客户端总数不超过您的 postgres 服务的max_connections设置,您应该没问题。否则,无法接受新连接。