我正在将sqlalchemy与pandas.to_sql()
一起使用,以将一些数据复制到SQL Server中。复制完成并调用engine.dispose()
之后,我在日志中看到以下INFO消息:
[INFO] sqlalchemy.pool.impl.QueuePool: Pool recreating
我想知道此消息是否意味着即使我废弃了引擎,连接仍然保持活动状态。如果是这样,什么是安全正确的方法?
答案 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()时,它将真正关闭连接,并且不会保持任何签入连接处于活动状态