我用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.con
和self.cur
。
答案很简单:只要同时连接的客户端总数不超过您的 postgres 服务的max_connections
设置,您应该没问题。否则,无法接受新连接。