SQLAlchemy / pyODBC 不释放数据库连接
SQLAlchemy / pyODBC not releasing database connection
我正在使用 SQLAlchemy(仅核心,不是 ORM)创建到 SQL Server 2008 SP3 的连接。
在查看进程的网络连接时,我注意到与 SQL 服务器(端口 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
我后来加了NullPool
和engine.dispose()
,以为这样可以解决挥之不去的联系,可惜
我正在使用指定的基于主机名的连接 here。
版本:
- Python 3.5.0(Win7 上的 x32)
- SQL炼金术 1.0.10
- pyODBC 3.0.10
编辑:我重写了代码以仅使用 pyODBC 而不是 SQLAlchemy + pyODBC,问题仍然存在。据我所知,问题是由 pyODBC 保持连接打开引起的。
当只有 pyODBC 时,问题 是因为 here 所讨论的连接池。
如docs所述:
pooling
A Boolean indicating whether connection pooling is enabled.
This is a global (HENV) setting, so it can only be modified before the
first connection is made. The default is True, which enables ODBC
connection pooling.
因此:
import pyodbc
pyodbc.pooling = False
conn = pyodbc.connect(db_connection_string)
conn.close()
似乎在使用 SQLAlchemy 并使用 NullPool
禁用 SA 池时,这不会传递给 pyODBC。
我正在使用 SQLAlchemy(仅核心,不是 ORM)创建到 SQL Server 2008 SP3 的连接。
在查看进程的网络连接时,我注意到与 SQL 服务器(端口 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
我后来加了NullPool
和engine.dispose()
,以为这样可以解决挥之不去的联系,可惜
我正在使用指定的基于主机名的连接 here。
版本:
- Python 3.5.0(Win7 上的 x32)
- SQL炼金术 1.0.10
- pyODBC 3.0.10
编辑:我重写了代码以仅使用 pyODBC 而不是 SQLAlchemy + pyODBC,问题仍然存在。据我所知,问题是由 pyODBC 保持连接打开引起的。
当只有 pyODBC 时,问题 是因为 here 所讨论的连接池。
如docs所述:
pooling
A Boolean indicating whether connection pooling is enabled. This is a global (HENV) setting, so it can only be modified before the first connection is made. The default is True, which enables ODBC connection pooling.
因此:
import pyodbc
pyodbc.pooling = False
conn = pyodbc.connect(db_connection_string)
conn.close()
似乎在使用 SQLAlchemy 并使用 NullPool
禁用 SA 池时,这不会传递给 pyODBC。