Windows环境Python连接SQL Server如何用pyodbc实现连接池
基于pyodbc实现SQL Server连接池的方案
这里分两种可落地的实现方式,可根据自身业务场景选择:
方案1:应用层自定义连接池(推荐,可控性更高)
用Python通用数据库连接池工具DBUtils实现,支持自定义连接数上限、空闲回收、线程安全等能力,适合多并发读写的业务场景。
第一步:安装依赖
pip install pyodbc DBUtils
第二步:封装连接池工具
import pyodbc from DBUtils.PooledDB import PooledDB import sys import time # 初始化连接池,全局只初始化一次即可 SQL_SERVER_POOL = PooledDB( creator=pyodbc, # 使用的数据库驱动 maxconnections=10, # 连接池允许的最大连接数,0和None表示不限制 mincached=2, # 初始化时连接池创建的空闲连接数 maxcached=5, # 连接池最多允许的空闲连接数 maxshared=3, # 允许的共享连接数,pyodbc线程不安全建议设为0或者3以内 blocking=True, # 连接池用完时是否阻塞等待,False的话没连接就抛异常 maxusage=None, # 单个连接最多被复用次数,None表示无限次 setsession=[], # 连接创建后执行的前置命令 # 以下是pyodbc连接参数 DRIVER='{ODBC Driver 17 for SQL Server}', SERVER='here-is-IP-address-of-servier', DATABASE='here-is-my-db-name', UID='here-is-my-username', PWD='here-is-my-password' )
第三步:改造原有业务代码
从连接池获取连接,使用完成后连接会自动放回连接池复用,不需要手动关闭连接:
def get_limited_rows(size): conn = None cursor = None try: # 从连接池获取连接 conn = SQL_SERVER_POOL.connection() cursor = conn.cursor() print('Connected to database') select_query = 'select APPN, APPD from MAIN' cursor.execute(select_query) while True: records = cursor.fetchmany(size) if not records: cursor.close() sys.exit("Completed") else: for record in records: print(record) time.sleep(10) except pyodbc.Error as error: print('Error reading data from table', error) finally: if cursor: cursor.close() if conn: # 这里的close不是真的关闭连接,是把连接放回连接池 conn.close() print('Connection returned to pool')
方案2:ODBC驱动级连接池(轻量场景适用)
pyodbc默认开启了ODBC驱动层面的连接池,不需要引入第三方依赖,驱动会自动复用同配置的连接,仅需在初始化连接前加一行配置即可:
# 开启驱动级连接池,默认值就是True,显式配置更清晰 pyodbc.pooling = True
该方案的优势是改造成本极低,适合单线程、访问频率不高的简单业务场景,缺点是无法自定义连接数限制、空闲回收等规则。
注意事项
- 连接池全局仅需初始化一次,不要在每次请求/每次调用函数时重复初始化连接池
- pyodbc的连接不是线程安全的,多线程场景下不要在多个线程中共享同一个连接对象,每个线程从连接池单独拿连接使用
内容的提问来源于stack exchange,提问作者gtrosh.ka
相关产品推荐
相关产品推荐

