【问题标题】:SQLAlchemy engine.execute() leaves a connection to the database in sleeping statusSQLAlchemy engine.execute() 使与数据库的连接处于睡眠状态
【发布时间】: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 表中看到服务器上的一个条目。此条目仅在我终止进程后才会消失。

【问题讨论】:

    标签: python sql-server sqlalchemy pymssql


    【解决方案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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2017-06-08
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      相关资源
      最近更新 更多