2016-02-02 2 views
0

Я использую SQLAlchemy (только Core, а не ORM) для создания соединения с SQL Server 2008 SP3.SQLAlchemy/pyODBC не освобождает соединение с базой данных

При рассмотрении сетевых подключений процесса я заметил, что соединение TCP/IP с SQL Server (порт 1433) остается открытым (ESTABLISHED).

Пример кода:

from urllib.parse import quote_plus 
from sqlalchemy.pool import NullPool 
import sqlalchemy as sa 

# parameters are read from a config file 
db_params = quote_plus(';'.join(['{}={}'.format(key, val) for key, val in db_config.items()])) 
# Hostname based connection 
engine = sa.create_engine('mssql:///?odbc_connect={}'.format(db_params), 
          poolclass=NullPool) 

conn = engine.connect() 
conn.close() 

engine.dispose() 
engine = None 

Я добавил NullPool и engine.dispose() потом, думая, что они могли бы решить сохраняющиеся связь, но увы.

Я использую как соединение на основе имени хоста, как указано here.

Версии:

  • Python 3.5.0 (x32 на Win7)
  • SQLAlchemy 1.0.10
  • pyODBC 3.0.10

Edit: Я я переписал мой код, чтобы использовать pyODBC исключительно вместо SQLAlchemy + pyODBC, и проблема остается. Насколько я вижу, проблема связана с тем, что pyODBC поддерживает соединение.

ответ

0

Когда только pyODBC, вопрос связан с подключением пула, как обсуждалось here.

Как описано в docs:

Объединив

логическое значение, указывающее, включен ли пул соединений. Это глобальная (HENV) настройка, поэтому ее можно изменить только до первого соединения . По умолчанию используется значение True, что позволяет подключать пул соединений ODBC .

Таким образом:

import pyodbc 

pyodbc.pooling = False 
conn = pyodbc.connect(db_connection_string) 
conn.close() 

кажется, что при использовании SQLAlchemy и отключение пулы SA с помощью NullPool, это не передается в pyODBC.