PostgreSQL + Python:关闭连接

21

我用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

也就是说,我使用同一个连接对象处理所有客户的查询,并且从不关闭该连接。与为每个客户端打开和关闭连接相比,这样做看起来更好,我的服务器显然工作得很好。您认为这样做好吗?还是不要这样做?谢谢。

3个回答

7

@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 ()

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

2

这可能可以工作,但不是很好。问题:如何为会话设置日期时间格式?如何处理事务?临时表?如何处理错误?另请参见:如何使用psycopg和gevent池化连接?

对于这些问题,您可以使用连接池。这样,当您开始使用新客户端(新的网络连接)时,您可以从池中获取数据库连接。在使用完毕后,您可以释放它而不是关闭连接,然后它就会返回到池中。现在它可以被其他线程使用。

如果您的连接出现故障,它可能会被简单地关闭而不是返回到池中。每个线程都可以使用事务,并且您可以更改会话设置,例如日期时间格式。

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

附注:在您的方法中,应该使用self.conself.cur


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

谢谢你的回答! - ProgNova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接