基于node-mssql的Socket.IO应用SQL Server连接耗尽排查求助
Node.js + node-mssql 高并发写入超时问题求助
核心问题
运行基于Socket.IO的Node.js应用,Socket.IO接收的数据通过node-mssql写入SQL Server。当并发Socket.IO连接达到300时,数据库查询出现瓶颈,触发无明确原因的超时错误:
Error: operation timed out for an unknown reason at C:\Users\jeanm\WebstormProjects\TikTokResearchNode\node_modules\tarn\dist\PendingOperation.js:17:27 at runNextTicks (node:internal/process/task_queues:61:5) at listOnTimeout (node:internal/timers:528:9) at processTimers (node:internal/timers:502:7)
所用查询
项目使用三类INSERT查询:
- 两个固定逻辑的INSERT语句(涉及用户、视频关联数据写入)
- 一个动态生成INSERT语句的工具方法,支持不同表和字段的写入:
static #build_query(table_name, keys = [], return_id = false) { return ` INSERT INTO "${table_name}" (${keys.join(', ')}) ${return_id ? 'OUTPUT INSERTED.id' : ''} VALUES (${"?".repeat(keys.length).split("").join(", ")}) ` }
数据库设计
采用多表关联结构,包含用户表、视频表、统计数据表等,表间存在外键关联关系。
已尝试操作
原连接池最大连接数为10,按每秒约1500次查询的需求调整了连接池配置,但问题未解决:
{ connectionString: 'Driver=ODBC Driver 17 for SQL Server;Server=localhost;Database=ResearchTest;Trusted_Connection=yes;', driver: 'msnodesqlv8', pool: { max: 16384, min: 256, idleTimeoutMillis: 30000 } }
调试结果
监控连接池状态发现:
- 前30秒内,空闲连接数稳定在5-10个
- 30秒后,空闲连接数短时间内激增
推测是连接未正确归还至连接池,导致node-mssql持续创建新连接但无法复用,最终触发超时。
猜测方向
由于接触MSSQL仅几周,经验有限,目前猜测可能的原因:
- 表锁阻塞导致查询堆积,连接无法正常释放
- 高开销的INSERT查询占用过多连接资源,耗尽可用连接
求助问题
- 当前是否是表锁异常导致的问题?如何诊断和修复?
- 如果是其他问题,该从哪些方向排查?
- 面对数千并发查询的场景,如何有效定位故障点?
内容的提问来源于stack exchange,提问作者Isaac K
相关产品推荐
相关产品推荐

