Назад | Перейти на главную страницу

Периодически прерываются подключения к базе данных SQL Server

Иногда в одной из наших производственных сред (у нас есть дюжина или около того, и разные клиенты не указывают на каждого из них) мы получаем исключения на разных этапах процесса. Код не делает ничего необычного - только ваши базовые вставки и обновления. Однако мы выполняем несколько вставок и обновлений в одном соединении несколькими методами.

У нас будут такие исключения:

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, чтобы увидеть, есть ли какие-либо ошибки, которые вам нужно просмотреть.