使用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
验证步骤
- 先在单线程环境下测试,若错误消失,可确认是多线程共享连接导致的问题;
- 上线连接池或独立连接方案后,监控连接创建/销毁日志,确保无连接泄漏。
内容的提问来源于stack exchange,提问作者Edspeedy
相关产品推荐
相关产品推荐

