我在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
也就是说,我对来自所有客户的所有查询使用相同的连接对象,并且从不关闭连接,这看起来比打开和关闭每个客户端的连接更好,我的服务器显然运行良好。你想到这个吗? 这样做得好吗?不要做? 谢谢
答案 0 :(得分:2)
这可能有效但不好。问题:如何为会话设置日期时间格式?如何处理交易?临时表?如何处理错误?另见:How can I pool connections using psycopg and gevent?
对于这些事情,您可以使用连接池。这样,当您从新客户端(新网络连接)开始时,您将从池中获得数据库连接。使用它而不是关闭连接后,释放它并返回池。现在它可能被其他线程使用。
如果您的连接以某种方式被破坏,则可能是简单关闭而不是返回池。每个线程都可以使用事务,您可以更改日期时间格式等会话设置。
我看到有http://initd.org/psycopg/docs/pool.html
PS在您的方法中,您应该使用self.con
和self.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
设置,您就可以了。否则,不能接受新的连接。