測試文字功能,小工具,標題

記錄很重要,不然會浪費很多時間在找以前的記憶

一個人的氣度,決定他未來的高度。

2016年4月14日 星期四

ASP.NET 連線資料庫查詢比較久的話,會出現 Timeout expired 錯誤 連線逾時

ASP.NET 連線資料庫查詢比較久的話,會出現 Timeout expired 錯誤 連線逾時 

錯誤訊息

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

超時已過期。完成操作或服務器之前已超時期間沒有響應。

狀況說明:
當初開始是沒有很多資料時一個月一個月跑還正常,但當要跑一整年的資料後就出現問題
有個查詢用SQL工具查詢就要花3分鐘,後來在ASP.NET查就一直出現錯誤

排除:
有試著先把SQL查詢字串優化,但因為有個資料表沒有唯一索引,查詢一直無法優化
後來只好試著讓ASP.NET連線不要逾時這樣

上網找資料:

網路上找資料是說改 web.config的executionTimeout="90",無效,這個改完,還要加上下面那些

  <system.web>
 <httpRuntime executionTimeout="90" maxRequestLength="4096" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" />
  </ system.web>

也有說要改IIS設定

https://technet.microsoft.com/zh-tw/library/cc771956%28v=ws.10%29.aspx

裡面有一段說,但無效

=========================================================
若要使用 UI

    開啟 IIS 管理員。 如需開啟 IIS 管理員的資訊,請參閱開啟 IIS 管理員 (IIS 7)。

    展開 [連線] 窗格中的伺服器節點,然後按一下 [應用程式集區]。

    在 [應用程式集區] 頁面上,選取您要為其指定閒置逾時設定的應用程式集區,然後在 [動作] 窗格中,按一下 [進階設定]。

    在 [閒置逾時 (分)] 方塊中輸入分鐘數,然後按一下 [確定]。

 =========================================================
後來找到這篇
https://dotblogs.com.tw/rainmaker/archive/2010/01/11/12955.aspx  
加上這篇
http://www.blueshop.com.tw/board/FUM20050124191756KKC/BRD20101201233345X7V.html

測議後,原來問題出來Database的Timeout,cmd.CommandTimeout = 180; 這個有用

在SQL中改了一下 ,就OK了
==========================================================
                    try
                    {
                        cn.Open();
                        cmd.CommandTimeout = 180;
                        StrNumerator = cmd.ExecuteScalar().ToString();
                        cmd.CommandText = qs2;
                        StrDenominator = cmd.ExecuteScalar().ToString();
                      lbl_Numerator.Text = "分子 : " + StrNumerator;
                     
                        lbl_Denominator.Text = "分母 : " + StrDenominator;
                    }
                    catch (Exception err)
                    {
                        lblmsg.Text = "Connection 錯誤 : " + err.Message;
                    }
                    finally
                    {
                        cn.Close();
                        cn.Dispose();

                    }
==========================================================
  
因為我有用AJAX,所以 要改 AsyncPostBackTimeout="180" ,這個有用

 <asp:ScriptManager ID="ScriptManager1" runat="server"
        AsyncPostBackTimeout="180">
    </asp:ScriptManager>


總結
 
1.要改 web.config 裡 httpRuntime executionTimeout="180" 

2.再加上 cmd.CommandTimeout = 180 ,預設好像只有30秒

3.再加上有用AJAX,所以這個也要改 AsyncPostBackTimeout="180"

沒有留言:

張貼留言