背景:
最近总是出现客户端超时,那么根据超时进行排查
System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
原理:
客户端组件超时,一般分为Connection TimeOut 和Command Timeout
超时主要有以下几方面:
1.从连接池获取一个连接超时
2.创建一个新的连接超时
3.发送一个命令(Command)到数据库超时
4.使用带有context connection=true的属性连接发送命令(Command)到数据库超时。
5.当不是显示的发送命令(implicitly)到数据库超时。
6.执行异步命令时超时
7.从服务端获取记录时超时
8.使用bulk copy时超时。
上面8个,最有前面2个是属于 Connection Timeout,其他都是Command Timeout。
分析:
从错误来看就是Command Timeout报出的错误,客户端的Command Timeout生成环境下的设置时默认的也就是30秒。
在数据库监控层,我们设置了XEVENT对超过10s的查询监控,还有手写的堵塞超过10s的监控,中间并没有发现有堵塞情况。
那么可以排除掉6,在执行命令时超时。
并且不使用context connection=true那么可以排除掉4,带有context connection=true属性发送Command命令。
也不会使用bulk copy,所以第8点也可以排除。
通过sys.dm_os_ring_buffers也没有发现sql server主动断开连接。
结论:
那么可以认为是客户端在获取结果或者发送命令的时候,发生的超时。
参考:
《SQL Server 2012实施与管理实战指南》 第4章,第6章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现