SqlAlchemy在engine.dispose()之后重新创建池

2024-09-28 20:19:38 发布

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

我正在使用sqlalchemy和pandas.to_sql()将一些数据复制到SQL server中。复制完成并调用engine.dispose()后,我在日志中看到以下信息消息:

[INFO] sqlalchemy.pool.impl.QueuePool: Pool recreating

我想知道这条消息是否意味着即使我处理了发动机,连接仍然保持带电。如果是这样的话,那么安全和正确的方法是什么


Tags: to数据info信息消息pandassqlserver
2条回答

连接未激活。但是您可以在Pool对象的帮助下重新启动连接

这在documentation中有详细描述:

The Engine has logic which can detect disconnection events and refresh the pool automatically.

When the Connection attempts to use a DBAPI connection, and an exception is raised that corresponds to a “disconnect” event, the connection is invalidated. The Connection then calls the Pool.recreate() method, effectively invalidating all connections not currently checked out so that they are replaced with new ones upon next checkout.

还可以查看链接中的代码示例。它真的很整洁

如果存在一个已从池中签出的连接,那么这些连接将仍然处于活动状态,因为它们正被某个对象引用

有关详细信息,请参阅以下链接。 https://github.com/sqlalchemy/sqlalchemy/blob/master/lib/sqlalchemy/engine/base.py#L2512-L2539https://docs.sqlalchemy.org/en/13/core/connections.html#engine-disposalhttps://docs.sqlalchemy.org/en/13/core/connections.html#sqlalchemy.engine.Engine.dispose

如果您正在使用QueuePool(默认情况下,如果您在创建引擎对象时未指定任何poolClass),并且不希望任何连接保持活动状态,则可以关闭连接[conn.close()或session.close()],从而将连接返回到池(称为签入连接)。稍后,当您在复制作业完成后调用engine.dispose()时,这将真正负责关闭连接,而不会使任何签入连接保持活动状态

相关问题 更多 >