【问题标题】:PostgreSQL + Python: Close connectionPostgreSQL + Python:关闭连接
【发布时间】:2014-12-11 08:39:48
【问题描述】:

我用 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

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    他们对此有何看法?在我看来更好。感谢您的建议和支持。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 感谢您的回答!
        猜你喜欢
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 2016-04-20
        • 2013-09-04
        • 2019-07-11
        • 2015-06-27
        相关资源
        最近更新 更多