【问题标题】:psycopg2 close connection poolpsycopg2 关闭连接池
【发布时间】:2018-04-11 15:15:52
【问题描述】:

我正在开发一个 Flask API,并且我有以下代码来使用 Psycopg2 建立一个连接池。我想知道当程序终止时我应该考虑关闭连接池,我应该怎么做?

@contextmanager
def get_cursor(:
    global connection_pool
    if not cls.connection_pool:
        cls.connection_pool = ThreadedConnectionPool(5, 25, dsn=PoolingWrap.generate_conn_string())

    con = cls.connection_pool.getconn()
    try:
        yield con.cursor(cursor_factory=RealDictCursor)
    finally:
        cls.connection_pool.putconn(con)

【问题讨论】:

  • 在寻求答案之前,我想知道您是否有理由不使用 sqlalchemy,它有一些方法可以帮助您处理这个问题。
  • 你用的是什么服务器?
  • 我同意@LuisOrduz,SQLAlchemy 是在 Flask 中进行数据库查询的推荐 ORM。 Flask-SQLAlchemy 库有据可查。
  • 这与 Flask 或 SQLAlchemy 无关。一般的问题是connection_pool是否需要以任何方式关闭,是否可以安全完成。
  • @mart1n - 你试过用'with'吗? python.org/dev/peps/pep-0343

标签: python python-3.x flask psycopg2


【解决方案1】:

我相信,只要您正确关闭每个连接中的事务,那么离开全局池就不会有任何问题。 我认为在这种情况下可能发生的最坏情况是数据库端的某些连接需要一段时间才能确定它们已在客户端关闭 - 但这应该不会导致任何数据一致性类型问题。

但是,如果您真的想在退出之前关闭连接池,一种方法是注册一个atexit 函数。

import atexit

@atexit.register
def close_connection_pool():
    global connection_pool
    connection_pool.closeall()

【讨论】:

  • 我认为.close() 将强制关闭任何现有连接,即使它们正在处理事务。有什么方法可以等待这些连接自行关闭(或在一段时间后强制关闭)然后才退出?
  • @mart1n 可能有办法做到这一点,但只有在程序关闭时才会调用“atexit”处理程序。在那个阶段,一切都应该完成。您可能应该在更高级别处理这种逻辑 - 在您的主线程退出之前。
  • pool有关闭方法吗? initd.org/psycopg/docs/pool.html我没看到。文档说“这个池类主要设计用于与 Zope 交互,可能在通用应用程序中没有用”eek。它是用于连接的客户端容器,因此是否关闭连接似乎比关闭pool 更相关。 pool 确实有一个 closeall() 方法,如果真的有必要的话,但正如你所说的那样,这不会成为问题,因为连接对象将被 GC 删除,并且服务器最多需要一段时间才能工作出来了。
  • @Davos - 你是对的 closeall - 我已经更新了。谢谢。
  • @Davos - 我读到有关 Zope 的 cmets 仅与 PersistentConnectionPool 子类有关,而不是 ThreadedConnectionPoolSimpleConnectionPool
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多