“逾時時間已到。在操作完成之前逾時時間已過或伺服器未響應”
初步分析原因為對MSSQL操作時連接配接逾時,知道這事,以前沒留意,大概是在配置檔案中設定連接配接時限,在網上找了下解決方法,大多說在資料庫連接配接字元串裡解決
SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;") 改為:
SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;Connect Timeout=500") 似乎沒效果。依然運作30秒即報逾時!
突然感覺似乎應該可以在連接配接資料庫代碼中指明,式了下con的屬性,有個ConnectionTimeout,
SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=;");
con.ConnectionTimeout = 180; // 報錯,屬性ConnectionTimeout 為隻讀! 嘗試失敗,再接着看command對象屬性,發現其也有類似屬性!CommandTimeout設定一下:
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 180; 再運作,即解決,這裡設定的時間的180秒,即三分鐘!可根據需要設定,如果過長,也可以設定為0,當此屬性設定為0時表示不限制時間。此屬性值應該慎用。還需要在Web.config配置檔案中設定http請求運作時限間
< system .web >
< httpRuntime maxRequestLength ="102400" executionTimeout ="720" />
</ system.web >
這裡設定的為720秒,前面的屬性maxRequestLength一般用于使用者上傳檔案限制大小!預設一般為4096 KB (4 MB)。
看一下來自MSDN解釋:
httpRuntime是配置asp.net http運作時設定,以确定如何處理對asp.net應用程式的請求。
executionTimeout:表示允許執行請求的最大時間限制,機關為秒
maxRequestLength:訓示 ASP.NET 支援的最大檔案上載大小。該限制可用于防止因使用者将大量檔案傳遞到該伺服器而導緻的拒絕服務攻擊。指定的大小以 KB 為機關。預設值為 4096 KB (4 MB)。
useFullyQualifiedRedirectUrl:表示訓示用戶端重定向是否是完全限定的(采用 "http://server/path" 格式,這是某些移動控件所必需的),或者訓示是否代之以将相對重定向發送到用戶端。如果為 True,則所有不是完全限定的重定向都将自動轉換為完全限定的格式。false 是預設選項。
minFreeThreads:表示指定允許執行新請求的自由線程的最小數目。ASP.NET 為要求附加線程來完成其處理的請求而使指定數目的線程保持自由狀态。預設值為 8。
minLocalRequestFreeThreads:表示ASP.NET 保持的允許執行新本地請求的自由線程的最小數目。該線程數目是為從本地主機傳入的請求而保留的,以防某些請求在其處理期間發出對本地主機的子請求。這避免了可能的因遞歸重新進入 Web 伺服器而導緻的死鎖。
appRequestQueueLimit:表示ASP.NET 将為應用程式排隊的請求的最大數目。當沒有足夠的自由線程來處理請求時,将對請求進行排隊。當隊列超出了該設定中指定的限制時,将通過“503 - 伺服器太忙”錯誤資訊拒絕傳入的請求。
enableVersionHeader:表示指定 ASP.NET 是否應輸出版本标頭。Microsoft Visual Studio 2005 使用該屬性來确定目前使用的 ASP.NET 版本。對于生産環境,該屬性不是必需的,可以禁用。
經檢查後發現,這是因為頁面在讀取資料庫中的資料時耗時太長,超過了預設的30秒。是以報出了以上錯誤,解決該問題的方法是:
一,優化sql語句,提高查詢速度
二,延長sql逾時的時間設定
最好的方法當然是第一種了,這才是治本的方法。但sql優化可不是一件簡單的活,具體的環境有不同的方法。本章主要看一下如何通過第二種方法來解決問題。
1,首先設定sql的執行逾時時間。
如果我們的sql是直接使用SqlCommand對象來執行的,那麼可以設定SqlCommand的CommandTimeout屬性的值。
比如:
using (SqlCommand cmd = new SqlCommand(SQLString, connection))
{
cmd.CommandTimeout=180
}
這樣我們就設定了cmd的逾時間時間是180秒。
注意:SqlCommand.CommandTimeout屬性的機關為秒,預設值是30。
如果我們的sql是利用SqlDataAdapter對象來擷取資料集合,那麼我們還可以分别通過以下方法設定SqlCommand的逾時時間。
using (SqlConnection connection = GetConnection())
{
……
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand.CommandTimeout = 180;//設定查詢sql的逾時時間
sqlDA.InsertCommand.CommandTimeout = 180;//設定插入sql的逾時時間
sqlDA.UpdateCommand.CommandTimeout = 180;//設定修改sql的逾時時間
sqlDA.DeleteCommand.CommandTimeout = 180;//設定删除sql的逾時時間
……
}
也許大家在有些網站上看到以下解決方法
1),在資料庫的連接配接字元串中添加逾時時間設定,如下:
SqlConnection con = new SqlConnection'server=.;database=myDB;uid=sa;pwd=password;Connect Timeout=180'
但我有測試過,無效,也有可能是我的測試方法錯誤吧!!!
2),設定SqlConnection對象的逾時時間。
該方法是肯定行不通了,因為SqlConnection的ConnectionTimeout屬性根本就是個隻讀屬性,不允許設定值。從它的定義就可以看出來了,定義如下:
//
//摘要:
//擷取在嘗試建立連接配接時終止嘗試并生成錯誤之前所等待的時間。
//
//傳回結果:
//等待連接配接打開的時間(以秒為機關)。預設值為 15 秒。
//
// 異常:
//System.ArgumentException:
//所設定的值小于 0。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[ResDescription("SqlConnection_ConnectionTimeout")]
public override int ConnectionTimeout { get; }
2,設定asp.net請求的逾時時間。
在上面的設定中我們有處理了sql的逾時時間,但可能你的設定還是無效。這是為什麼呢?因為你還沒有設定asp.net請求的逾時時間。
要如何設定asp.net請求的逾時時間呢?修改web.config的httpRunTime節即可,示例如下:
<system.web>
<httpRuntime executionTimeout="180" />
</system.web>
其中httpRuntime屬性與executionTimeout屬性的意思分别如下:
httpRuntime: 配置 ASP.NET HTTP 運作時設定,以确定如何處理對 ASP.NET 應用程式的請求。
executionTimeout: 設定asp.net關閉前允許發生的上載秒數
設定完這兩步,我們的問題才算的真正的解決了。