PostgreSQL + Python:关闭连接

时间:2014-12-11 08:39:49

标签: 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

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

3 个答案:

答案 0 :(得分:2)

这可能有效但不好。问题:如何为会话设置日期时间格式?如何处理交易?临时表?如何处理错误?另见:How can I pool connections using psycopg and gevent?

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

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

我看到有http://initd.org/psycopg/docs/pool.html

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

答案 1 :(得分:1)

@MichałNiklas感谢您的回答和感谢校正self.con和self.cur,我忘记了“自我”。

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

我打算这样做:

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

在我班上: 如果来自client1的新请求...此客户端的“线程”,则查询运行...

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 :(得分:0)

我认为答案很简单:只要同时连接的客户总数不超过您的postgres服务的max_connections设置,您就可以了。否则,不能接受新的连接。