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

时间:2020-06-12 15:57:40

标签: python pandas sqlalchemy

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

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

我想知道此消息是否意味着即使我废弃了引擎,连接仍然保持活动状态。如果是这样,什么是安全正确的方法?

2 个答案:

答案 0 :(得分:0)

连接无效。但是,您可以借助Pool对象来重新启动连接。

这在documentation中有详细描述:

引擎具有可以检测断开连接事件并自动刷新池的逻辑。

当连接尝试使用DBAPI连接并且引发与“断开连接”事件相对应的异常时,该连接将无效。然后,Connection调用Pool.recreate()方法,有效地使所有当前未检出的连接无效,以便在下次检出时将它们替换为新的连接。

也请查看链接中的代码示例。真的很整洁。

答案 1 :(得分:0)

如果有一个已经从池中检出的连接,则这些连接在被某些事物引用时仍将保持活动状态。

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

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