2

我正在用 Pandas 和 Postgres 做很多 ETL。我有大量空闲连接,其中许多都标有COMMITROLLBACK,我不确定如何防止长时间处于空闲状态而不是关闭。我用来写入数据库的主要代码是使用 pandas to_sql

def write_data_frame(self, data_frame, table_name):
    engine = create_engine(self.engine_string)
    data_frame.to_sql(name=table_name, con=engine, if_exists='append', index=False)

我知道这绝对不是 PostgreSQL 的最佳实践,我应该做一些事情,比如将参数传递给存储过程或函数或其他东西,但这就是我们设置从非 Postgres 数据库/数据源获取 data_frames 并上传到 Postgres 的方式.

我的 pgAdmin 看起来像这样:

在此处输入图像描述

有人可以指出我将来如何避免这么多空闲连接的正确方向吗?我们的一些数据库连接是长期存在的,因为它们是连续的“批处理”过程。但似乎一些一次性事件使连接处于打开状态和空闲状态。

4

1 回答 1

3

engine一次性使用可能不适合您。如果可能,您可以使引擎成为该类的成员并将其称为self.engine.

另一种选择是明确处置引擎。

def write_data_frame(self, data_frame, table_name):
    engine = create_engine(self.engine_string)
    data_frame.to_sql(name=table_name, con=engine, if_exists='append', index=False)
    engine.dispose()

文档中所述

这具有完全关闭所有当前签入的数据库连接的效果。仍然签出的连接不会关闭,但是它们将不再与此引擎关联,因此当它们单独关闭时,最终它们关联的池将被垃圾收集并完全关闭,如果入住时尚未关闭。

这也可能是块的一个很好的用例,try...except...finally因为.dispose只有在前面的代码执行没有错误时才会调用。

我宁愿建议你像这样传递连接:

with engine.connect() as connection:
    data_frame.to_sql(..., con=connection)

但是to_sql文档表明您不能这样做,他们只会接受engine

于 2019-02-22T16:53:27.960 回答