Python SQLAlchemy engine.execute()使到数据库的连接保持休眠状态

Python SQLAlchemy engine.execute()使到数据库的连接保持休眠状态,python,sql-server,sqlalchemy,pymssql,Python,Sql Server,Sqlalchemy,Pymssql,我正在使用SQL server数据库。我注意到,在执行下面的代码时,我得到了一个到数据库的连接,该数据库处于“休眠”状态,状态为“等待命令” engine = create_engine(url, connect_args={'autocommit': True}) res = engine.execute(f"CREATE DATABASE my_database") res.close() engine.dispose() 在engine.dispose调用

我正在使用SQL server数据库。我注意到,在执行下面的代码时,我得到了一个到数据库的连接,该数据库处于“休眠”状态,状态为“等待命令”

    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表中看到服务器上的一个条目。只有在我终止进程后,此条目才会消失。

可能

连接池

连接池是用于 在内存中维护长时间运行的连接,以便高效地重复使用,如有必要 以及提供连接总数的管理 应用程序可能同时使用

特别是对于服务器端web应用程序,连接池非常重要 维护活动数据库连接“池”的标准方法 在内存中,可跨请求重用

SQLAlchemy包括几个连接池实现 与发动机集成。它们也可以直接用于 希望将池添加到其他普通DBAPI的应用程序 接近

我不确定这是否是我删除数据库的方法的障碍

要删除可能正在使用的数据库,请尝试:

USE master;
ALTER DATABASE mydb SET RESTRiCTED_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE mydb;

基本上,您希望杀死所有可以使用的连接,如下所示:

适用于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
更多信息可在此处找到:

是的,我不确定这是否是我删除数据库的拆卸方法的障碍-我得到数据库正在使用错误,我假设是来自池的休眠连接。我不确定我是否能把这些时间定下来。