SQLAlchemy engine.execute () оставляет соединение с базой данных в спящем состоянии - PullRequest
0 голосов
/ 25 октября 2019

Я использую базу данных сервера SQL. Я заметил, что при выполнении приведенного ниже кода я получаю соединение с базой данных, оставшейся в «спящем» состоянии со статусом «AWAITING COMMAND».

    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. Эта запись исчезает только после завершения процесса.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Возможно Пул соединений

Пул соединений

Пул соединений - это стандартная техника, используемая для поддержания длительных соединений в памяти для эффективного повторного использования,а также для управления общим количеством соединений, которые приложение может использовать одновременно.

В частности, для серверных веб-приложений пул соединений является стандартным способом поддержания «пула» активных соединений с базой данных впамять, которая повторно используется в запросах.

SQLAlchemy включает несколько реализаций пула соединений, которые интегрируются с Engine. Они также могут использоваться непосредственно для приложений, которые хотят добавить пул к подходу DBAPI.

.

Я не уверен, что это то, что входит вспособ моего метода разрыва, который удаляет базу данных

Чтобы удалить базу данных, которая, возможно, используется, попробуйте:

USE master;
ALTER DATABASE mydb SET RESTRiCTED_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE mydb;
0 голосов
/ 30 октября 2019

В основном вы хотите уничтожить все соединения. Вы можете использовать что-то вроде этого:

Для 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

Больше можно найти здесь: Скрипт для уничтожения всех соединений с базой данных (больше, чем RESTRICTED_USER ROLLBACK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...