[.NET]必須有開啟與可用的連接。連接目前的狀態已關閉。

系統發生「必須有開啟與可用的連接。連接目前的狀態已關閉。」的錯誤。
有可能是什麼問題呢?

最近跟同事 William哥 看一個系統的錯誤,錯誤訊息為「必須有開啟與可用的連接。連接目前的狀態已關閉。」,如下,

ExecuteNonQuery 必須有開啟與可用的連接。連接目前的狀態已關閉。  
於 System.Data.SqlClient.SqlConnection.GetOpenConnection(String method)  
於 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)  
於 System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)  
於 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)  
於 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

 

在所有的作業中,只有某一個項目會發生這樣的子的狀況。

看那個作業的時間大約是1分鐘,然後就跳出錯誤。

心理想應該是跟某個東西的 Timeout 有關。因為很多 Timeout 時間都是 60 秒。

於是查看設定檔中 Command Timeout 的設定,是 600 秒。

因為系統中有使用 TransactionScope ,於是查到 TransactionScope 預設的 Timeout 為 60 秒。

剛好符合我們目前問題的狀況。

所以就查到「Transaction scope timeout on 10 minutes」這篇,

可以在 web.config 中設定 TransactionScope 的 Timeout 時間。

後來我們就在 config 中將  TransactionScope 的 Timeout 時間拉長 就可以了。

<system.transactions>
     <defaultSettings timeout="00:03:00" />
</system.transactions>

所以大家如果遇到類似的問題,可以參考看看,調整適合系統的Timeout哦!

 

參考資料

What is TransactionScope default Timeout value?

Transaction scope timeout on 10 minutes

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^