问题描述
在一个老的.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:机器名