【.Net】數據庫的Connection Timeout和Command Timeout 超時

每次對數據庫連接時,我們有時候會碰到連接超時或者命令超時,這兩個超時是不一樣的。以ADO.NET爲例,當客戶端和服務器端連接時,碰到的超時情況主要有下面幾種:
當從連接池獲取一個連接時,碰到超時。
當建立一個全新連接(而不是從連接池獲取)時,碰到超時。
當發送一個命令(command)到SQL Server時,超時。
當發送命令(連接字符串帶有“context connection=true”屬性)到SQL Server時,超時。
當不是顯示的發送一個命令(implicitly)到SQL Server時,碰到超時。
當執行異步命令時,(BeginExecute)碰到超時。
當從服務器端,獲取行時,碰到超時。
當用Bulk copy方式,上傳數據時,碰到超時。
這些超時主要是通過連接字符串中的Connect Timeout和SqlCommand.CommandTimeout來進行控制。前面兩種是登錄超時由Connection Timeout來決定什麼時候超時,後面幾種是命令超時由Command Timeout來決定什麼時候超時。

 

SqlConnection.ConnectionTimeout :
1. 說明: 獲取在嘗試建立連接時終止嘗試並生成錯誤之前所等待的時間。
2. 默認值:等待連接打開的時間(以秒爲單位)。默認值爲 15 秒。
3. 備註:值 0 指示無限制
4. 只讀

注意ConnectionTimeout可以在數據庫連接字符串上直接進行設置,如下所示:

Server=(localdb)\mssqllocaldb;Database=yourDb;Trusted_connection=true;Connect Timeout=100;

這也是目前使用EF Core時,設置ConnectionTimeout比較好的一種方式

 

SqlCommand.CommandTimeout :
1. 說明:獲取或設置在終止執行命令的嘗試並生成錯誤之前的等待時間。
2. 默認值:等待命令執行的時間(以秒爲單位)。默認爲 30 秒。
3. 備註:值 0 指示無限制,在 CommandTimeout 中應避免值 0,否則會無限期地等待執行命令。
4. 可讀可寫

在EF Core中可以通過DbContext來調用SetCommandTimeout和GetCommandTimeout方法,來設置和獲取CommandTimeout的值,如下所示:

DbContext dbContext = ...//創建DbContext對象

dbContext.Database.SetCommandTimeout(100);
int? commandTimeout = dbContext.Database.GetCommandTimeout();

特別注意:
"超時時間已到。在操作完成之前超時時間已過或服務器未響應"
類似這種錯誤,一般是 SqlCommand.CommandTimeout  或者 SqlBulkCopy.BulkCopyTimeout 的時間超時, 而不是 SqlConnection.ConnectionTimeout。

發佈了189 篇原創文章 · 獲贊 153 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章