2016-02-02 88 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。