【问题标题】:SQLAlchemy / pyODBC not releasing database connectionSQLAlchemy / pyODBC 不释放数据库连接
【发布时间】:2016-05-11 08:41:57
【问题描述】:

我正在使用 SQLAlchemy(仅​​限核心,而不是 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 保持连接打开引起的。

【问题讨论】:

    标签: python python-3.x sqlalchemy pyodbc


    【解决方案1】:

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

    docs中所述:

    一个布尔值,指示是否启用连接池。 这是一个全局 (HENV) 设置,因此只能在 建立第一个连接。默认为 True,即启用 ODBC 连接池。

    因此:

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

    似乎在使用 SQLAlchemy 并使用 NullPool 禁用 SA 池时,这不会传递给 pyODBC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多