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

使用pymssql连接Azure SQL时随机出现Unknown Error问题求助

pymssql连接Azure SQL Server随机出现"Unknown error"的排查与解决

核心问题分析

你遇到的随机"Unknown error"本质是多线程共享非线程安全的数据库连接导致的连接损坏,新增playerEquipment表后请求量上升,线程冲突加剧,故障频率随之提升。一旦连接损坏,后续所有请求都会失败,重建连接后能短暂恢复,也符合连接被污染后的表现。


针对性解决方案

1. 修复多线程连接共享问题

pymssql的数据库连接不支持多线程并发访问,全局单连接DB_CONN在多线程的socketserver模型下必然出现随机损坏。

  • 解决方式:
    • 放弃全局单连接,改为每个请求/线程创建独立连接,或使用连接池管理连接生命周期。
    • 修改后的send_SQL_query示例:
      def send_SQL_query(self, query, params, get=False, fetchAll=True):
          conn = None
          cursor = None
          try:
              # 每个请求创建独立连接
              conn = pymssql.connect(server=server, user=user, password=password, database=database)
              cursor = conn.cursor()
              cursor.execute(query, params)
              
              if get:
                  result = cursor.fetchall() if fetchAll else cursor.fetchone()
                  return result
              else:
                  conn.commit()
          except Exception as e:
              print("Error: ", e)
              if conn:
                  conn.rollback()
              raise e
          finally:
              # 确保cursor和连接都被关闭
              if cursor:
                  cursor.close()
              if conn:
                  conn.close()
      

2. 优化Azure SQL连接配置

Azure SQL Server存在连接超时、连接数上限等限制,可能导致连接被主动断开:

  • 连接时添加超时参数,避免网络波动导致连接挂起:
    conn = pymssql.connect(
        server=server,
        user=user,
        password=password,
        database=database,
        login_timeout=30,  # 登录超时
        timeout=30         # 操作超时
    )
    
  • 登录Azure门户,检查SQL Server的连接池设置,调整最大连接数和闲置超时时间,匹配业务请求量;开启诊断日志,查看数据库侧的连接错误记录。

3. 更换更兼容的数据库驱动

pymssql对Azure SQL的兼容性不如pyodbc,若上述方案无效,可尝试切换驱动:

  • 安装pyodbc:pip install pyodbc
  • 示例连接代码:
    import pyodbc
    conn_str = (
        f"DRIVER={{ODBC Driver 18 for SQL Server}};"
        f"SERVER={server};"
        f"DATABASE={database};"
        f"UID={user};"
        f"PWD={password};"
        f"Encrypt=yes;"
        f"TrustServerCertificate=no;"
        f"Connection Timeout=30;"
    )
    conn = pyodbc.connect(conn_str)
    

4. 升级pymssql版本

旧版pymssql与Python 3.11、Azure SQL新版本可能存在兼容性问题,升级到最新稳定版:

pip install --upgrade pymssql

验证步骤

  1. 先在单线程环境下测试,若错误消失,可确认是多线程共享连接导致的问题;
  2. 上线连接池或独立连接方案后,监控连接创建/销毁日志,确保无连接泄漏。

内容的提问来源于stack exchange,提问作者Edspeedy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:37