SQLAlchemy engine.execute() 使与数据库的连接处于睡眠状态
Posted
技术标签:
【中文标题】SQLAlchemy engine.execute() 使与数据库的连接处于睡眠状态【英文标题】:SQLAlchemy engine.execute() leaves a connection to the database in sleeping status 【发布时间】:2019-10-25 13:52:20 【问题描述】:我正在使用 SQL 服务器数据库。我注意到,在执行下面的代码时,我得到了一个与处于“睡眠”状态的数据库的连接,并处于“等待命令”状态。
engine = create_engine(url, connect_args='autocommit': True)
res = engine.execute(f"CREATE DATABASE my_database")
res.close()
engine.dispose()
在engine.dispose()
调用之后有一个断点,我可以在EXEC sp_who2
表中看到服务器上的一个条目。此条目仅在我终止进程后才会消失。
【问题讨论】:
【参考方案1】:应该是Connection Pooling
连接池
连接池是一种标准技术,用于 在内存中保持长时间运行的连接以有效地重用,如 并提供对连接总数的管理 应用程序可能会同时使用。
特别是对于服务器端 Web 应用程序,连接池是 维护活动数据库连接“池”的标准方法 在内存中,跨请求重用。
SQLAlchemy 包括几个连接池实现,它们 与引擎集成。它们也可以直接用于 想要将池添加到其他普通 DBAPI 的应用程序 接近。
.
我不确定这是否会妨碍我删除数据库的拆卸方法
要删除可能正在使用的数据库,请尝试:
USE master;
ALTER DATABASE mydb SET RESTRiCTED_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE mydb;
【讨论】:
是的,我不确定这是否会妨碍我删除数据库的拆卸方法 - 我收到“正在使用的数据库”错误,我认为这是来自池的睡眠连接.不确定我是否可以超时。【参考方案2】:你基本上想杀死所有的连接你可以使用这样的东西:
适用于 MS SQL Server 2012 及更高版本
USE [master];
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id('MyDB')
EXEC(@kill);
对于 MS SQL Server 2000、2005、2008
USE master;
DECLARE @kill varchar(8000); SET @kill = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses
WHERE dbid = db_id('MyDB')
EXEC(@kill);
或者更像脚本的东西:
DECLARE @pid SMALLINT, @sql NVARCHAR(100)
DECLARE curs CURSOR LOCAL FORWARD_ONLY FOR
SELECT DISTINCT pid FROM master..sysprocesses where dbid = DB_ID(@dbname)
OPEN curs
fetch next from curs into @pid
while @@FETCH_STATUS = 0
BEGIN
SET @sql = 'KILL ' + CONVERT(VARCHAR, @pid)
EXEC(@sql)
FETCH NEXT FROM curs into @pid
END
CLOSE curs
DEALLOCATE curs
更多信息可以在这里找到: Script to kill all connections to a database (More than RESTRICTED_USER ROLLBACK)
【讨论】:
以上是关于SQLAlchemy engine.execute() 使与数据库的连接处于睡眠状态的主要内容,如果未能解决你的问题,请参考以下文章
无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 SQL Server DB