You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:09:04