随笔 - 95  文章 - 0  评论 - 47  阅读 - 84万 

 

问题描述

在一个老的.NET系统中,每天到运行到下午或者晚上就会出现连接数据库超时的问题Connection request timed out;针对该BUG进行了排查;

通过日志记录,后台程序分析,最终定位到原来是底层数据库帮助类未关闭连接导致,连接数不断增加,闲置连接也增大,最终达到最大连接池,导致无连接可用;

排查处理思路:

将程序中配置文件中最大线程池设置调大,max pool size=500,最终还是会出现上述问题,最终定位是连接未关闭导致;

通过数据库会话数查询进行分析:(GV$Session为集群中所有的,V$Session为本服务器)

--查看会话数排序  GV$Session 集群所有连接数数据
SELECT *
FROM   (SELECT PROGRAM, COUNT(1) AS LINKTOTAL
        FROM   GV$SESSION
        --WHERE PROGRAM='w3wp.exe' --连接进程
        GROUP  BY PROGRAM
        ) A
ORDER  BY LINKTOTAL DESC;

解决方案:

ExecuteNonQuery中关闭连接

 

dataset中增加try catch finally中关闭连接

 

ExecuteScalar/ExecuteXmlReader等方法均需要增加关闭;

ExecuteReader使用:reader使用完成需要关闭

注意:DataReader用完后一定要关闭!DataReader是独占连接的,所以用DataReader要快读快取快关闭!

这里提醒各位开发人员在后续的开发中,datareader读取完数据,一定要手动关闭reader;切记切记!!!

其他补充

如果查询一定时间内无活动的连接

复制代码
--查询超过30分钟未活动的会话  如果查集群所有则使用GV$SESSION表
SELECT SID, SERIAL#, MODULE, STATUS, S.LAST_CALL_ET,machine
FROM   V$SESSION S
WHERE  1 = 1
       AND S.USERNAME IS NOT NULL
      AND S.LAST_CALL_ET >= 30*60
       --AND PROGRAM = 'w3wp.exe'
       AND S.STATUS = 'INACTIVE'
ORDER  BY S.LAST_CALL_ET DESC;
复制代码
字段说明:
LAST_CALL_ET:上次执行sql后到当前时间间隔的时间(单位为秒)
machine:机器名
posted on   yxtic  阅读(7185)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示