zoukankan      html  css  js  c++  java
  • .NET 连接oracle 报错Connection request timed out问题排查分析

    问题描述

    在一个老的.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:机器名
  • 相关阅读:
    文件上传,跨浏览器统一的样式
    JAVA与JSON的序列化、反序列化
    错误记录--更改tomcat端口号方法,Several ports (8005, 8080, 8009)
    45个非常有用的 Oracle 查询语句小结
    三分钟学会不吃球
    Linux命令:TOP
    【Oracle】Oracle官方文档
    【MySQL】MySQL官方文档
    【oracle】处理oracle用户密码中的特殊字符$和@
    【shell】整数运算,小数运算
  • 原文地址:https://www.cnblogs.com/yx007/p/13215180.html
Copyright © 2011-2022 走看看