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

连接到mysql的速度极慢

在SQLAlchemy中区分RowProxy的json列?

flask and flask_sqlalchemy and flask_apscheduler

烧瓶-sqlalchemy 或 sqlalchemy

flask-sqlalchemy 和sqlalchemy的区别