SQLAlchemy / pyODBC不释放数据库连接

时间:2016-02-02 13:47:47

标签: python python-3.x sqlalchemy pyodbc

我使用SQLAlchemy(仅​​限Core,而不是ORM)来创建与SQL Server 2008 SP3的连接。

在查看流程时'网络连接,我注意到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上的x32)
  • SQLAlchemy 1.0.10
  • pyODBC 3.0.10

编辑:我已经重写了我的代码,只使用pyODBC而不是SQLAlchemy + pyODBC,问题仍然存在。因此,据我所知,问题是由pyODBC保持连接打开引起的。

1 个答案:

答案 0 :(得分:0)

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

here

中所述
  

汇集

     

一个布尔值,指示是否启用连接池。   这是一个全局(HENV)设置,所以它只能在之前修改   第一次连接。默认值为True,它启用ODBC   连接池。

因此:

ws2.lib(WS2.dll) : fatal error LNK1112: module machine type 'THUMB' conflicts with target machine type 'ARM'

似乎在使用SQLAlchemy并使用import pyodbc pyodbc.pooling = False conn = pyodbc.connect(db_connection_string) conn.close() 禁用SA池时,这不会传递给pyODBC。