[英]PostgreSQL + Python: Close connection
我用 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”。
我澄清一下,我对服务器和数据库知之甚少。
我打算这样做:
我的服务器为每个用户处理“线程”单独的进程,然后,在每个单独的进程中,考虑为客户查询打开一个连接,然后关闭此连接,如下所示:
在我的班级中:如果来自 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 ()
他们对此有何看法? 在我看来更好。 我感谢建议和支持。
这可能有效,但不好。 问题:如何为会话设置日期时间格式? 如何处理交易? 临时表? 如何处理错误? 另请参阅: 如何使用 psycopg 和 gevent 池连接?
对于此类事情,您可以使用连接池。 这样,当您开始使用新客户端(新网络连接)时,您会从池中获得 db 连接。 使用它而不是关闭连接后,您将其释放并返回到池中。 现在它可以被其他线程使用。
如果您的连接以某种方式中断,它可能会被简单地关闭而不是返回到池中。 每个线程都可以使用事务,您可以更改会话设置,例如日期时间格式。
我看到有http://initd.org/psycopg/docs/pool.html
PS 在你的方法中,你应该使用self.con
和self.cur
。
我认为这个问题的答案很简单:只要同时连接的客户端总数不超过 postgres 服务的max_connections
设置,你应该没问题。 否则不能接受新的连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.