PostgreSQL+Python:关闭连接

2024-06-28 18:51:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python制作了一个游戏服务器,它使用psycopg2连接到PostgreSQL db。我看过一些例子,我看到当创建到数据库的连接时,应该在完成查询时关闭连接,例如对于每个客户机:

#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

也就是说,我对所有客户的所有查询都使用相同的连接对象,并且从不关闭连接,这比为每个客户打开和关闭连接看起来更好,我的服务器显然工作得很好。你想到这个了吗? 干得好吗?不做什么?。 谢谢你


Tags: to服务器dbconnectcreateconnectionquerycon
4条回答

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

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

如果您的连接以某种方式断开,它可能是简单的关闭而不是返回池。每个线程都可以使用事务,您可以更改会话设置,如datetime格式。

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

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

我认为答案很简单:只要同时连接的客户端总数不超过postgres服务的^{}设置,就应该没问题。否则无法接受新连接。

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

他们是怎么想的?在我看来好多了。我感谢你的建议和支持。

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

他们是怎么想的?在我看来好多了。我感谢你的建议和支持。

相关问题 更多 >