.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:機器名


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM