Windows

SQL Server 數據庫連接被間歇性丟棄

  • November 10, 2011

偶爾在我們的一個生產環境中(我們有十幾個左右沒有不同的客戶端指向每個環境),我們會在流程的不同點遇到異常。程式碼沒有做任何花哨的事情——只是你的基本插入和更新。然而,我們正在跨多個方法的單個連接中執行多個插入和更新。

我們會得到這樣的異常:

System.InvalidOperationException: ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.
at System.Data.SqlClient.SqlConnection.GetOpenConnection(String method)
at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)....

還有這個:

System.Transactions.TransactionManagerCommunicationException: Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool. ---> System.Runtime.InteropServices.COMException (0x8004D024): The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
at System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim)
at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
--- End of inner exception stack trace ---
at System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)

還有這個:

System.InvalidOperationException: Invalid attempt to call Read when reader is closed.
at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
at System.Data.SqlClient.SqlDataReader.Read()

我不認為我們需要打開 MSDTC(同樣的事情在其他環境中都有效)。關於我們可以在程式碼方面或環境方面檢查的建議?

您呼叫數據庫命令的方法是什麼樣的?聽起來你有一個跨越多個邏輯程式碼塊的開放連接很長一段時間。

SqlConnection.Open()我建議您在需要打開連接之前以及連接完成後立即致電SqlConnection.Close()。這一切都應該在一個try/catch塊中進行。

如果您正在執行上述方法,則意味著連接沒有超時。在這種情況下,您需要查看 SQL Server 錯誤日誌以查看是否有任何需要查看的錯誤被拋出。

引用自:https://serverfault.com/questions/329636