【问题标题】:Should I manually close a database connection if using context managing (with-as)?如果使用上下文管理(with-as),我应该手动关闭数据库连接吗?
【发布时间】:2018-10-31 04:51:47
【问题描述】:

我正在学习如何将 PostgreSQL 数据库与 Python (3.6) 的 psycopg2 模块一起使用。我无法确定在什么情况下我应该手动关闭我的连接。 根据the docs

与文件对象或其他资源不同,退出连接 block 不会关闭连接,只会关闭关联的事务 with it:一个连接不仅可以用在 with 语句中,而且 每个 with 块都被有效地包装在一个单独的事务中

然后是示例代码sn-p:

conn = psycopg2.connect(DSN)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL1)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL2)

conn.close()

但是,我习惯于使用 with-as 进行上下文管理,即类似

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)

这是一个合理的方法,还是在运行上述之后仍然会有一个打开的连接?如果是这样,我该如何关闭它,因为 'conn' 不再存在?

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    根据官方文档:http://initd.org/psycopg/docs/connection.html#connection.close

    立即关闭连接(而不是每次执行 del 时)......

    当一个connection 对象被删除时,它将被关闭。虽然我没有找到相关的源代码,因为它们都是用 C++ 编写的。

    【讨论】:

    • “当一个连接对象被删除时,它会被关闭”——这意味着包括当你从一个 with-as 块中取消缩进时,那么?
    • 是的。 conn 对象丢失所有引用,将被 GC 删除。
    • 谢谢。立即,还是一段时间后?我的数据库一次接受多少个连接是有限制的,所以这会有所不同,而且我不了解 GC 的工作原理。
    • 这一切都取决于GC的心情......不是开玩笑,而是认真的。通常 GC 几乎会立即收集未使用的对象。但我们根本无法直接控制它。
    • 是的,没错。
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多