2016-02-02 193 views
0

我正在使用SQLAlchemy(仅​​限Core,不是ORM)创建与SQL Server 2008 SP3的连接。SQLAlchemy/pyODBC未发布数据库连接

在查看进程的网络连接时,我注意到与SQL Server(端口1433)的TCP/IP连接保持打开状态(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 

我增加了NullPoolengine.dispose()后,认为他们可能会解决挥之不去的连接,但很可惜。

我正在使用基于主机名的连接,如指定的here

版本:

  • 的Python 3.5.0(上Win7的32倍)
  • SQLAlchemy的1.0.10
  • pyODBC 3.0.10

编辑:我我重写了我的代码,只使用pyODBC而不是SQLAlchemy + pyODBC,问题依然存在。就我所知,这个问题是由pyODBC保持连接打开引起的。

回答

0

当只有pyODBC时,问题是因为连接池所讨论的here

docs描述:

汇集

布尔值,指示连接池是否被启用。 这是全局(HENV)设置,因此只能在 第一次连接之前进行修改。缺省值为True,这将启用ODBC连接池的ODBC 。

这样:

import pyodbc 

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

看来,使用SQLAlchemy的,通过使用NullPool禁用SA池时,这是不传下来的pyODBC。