Внутренняя фатальная ошибка соединения

Недавно я начал получать эту ошибку: "Внутренняя фатальная ошибка соединения" из моего приложения. Ошибка возникает случайным образом. Когда это произойдет, мое приложение неприменимо в течение следующих нескольких минут.

После тщательного анализа ошибки я пришел к выводу, что эта ошибка происходит только в одном методе в моем приложении. Этот метод запускает ряд простых обычных SQL-запросов, но он требует многопоточности, однако все потоки должны быть расположены перед этим блоком кода. Ошибка всегда выполняется по конкретному запросу SQL. Для теста я устранил этот запрос, который привел к ошибке, возникающей при следующем запросе строки.

Это стековая структура:

Internal connection fatal error.

-------------- Stack trace ---------------
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.IntentionalRethrow(Exception chainException, Exception originalException)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.RethrowRecommended(Exception chainException, Exception originalException)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry.Handle(Exception exceptionToHandle)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl.HandleException(Exception exceptionToHandle)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName, ExceptionPolicyFactory policyFactory)
   at Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicy.HandleException(Exception exceptionToHandle, String policyName)
   at Base.Sql.ExecuteScalar()

Приложение построено на .NET 3.5 и, очевидно, использует доступ к данным Enterprise Library. Приложение запускается на сервере терминалов Win2003 и использует базу данных Sql Server 2005, которая находится на другом сервере.

Метод, вызывающий эту ошибку, не запускается из графического интерфейса, а из командной строки, если это имеет какую-либо значимость.

Если кто-то подскажет, куда идти отсюда, я был бы очень благодарен.

Ответ 1

Я столкнулся с подобной проблемой и посвятил этому вопросу довольно много времени. Поэтому вам нужно проверить все следующие по одному.

  • Возможно, вы оставили какое-то открытое соединение с базой данных перед вызовом хранимой процедуры.
  • Это исключение возникает при вызове SqlDataReader.Close() или SqlDataReader.Dispose() - его можно исправить с помощью SqlConnection.Close() вместо SqlDataReader.Close()
  • Удалить папку временных файлов
  • Посмотрите на использование эфемерных портов сервером IIS. Значение по умолчанию max. доступных портов, как правило, 4000. Вы можете увеличить его, если ваше приложение совершает много вызовов в базе данных.

Сообщите мне, если это не помогло. Я мог бы получить шанс узнать что-то новое.

Ответ 2

Такие странные ошибки часто являются результатом многопоточного доступа к объектам, которые не являются потокобезопасными.

Я думаю, что пара вещей здесь не так.

  • повторное использование открытого соединения по потокам.
  • повторное использование клиентских объектов sql в потоках.
  • не закрывать открытые соединения правильно - вы завершаете создание соединения с помощью using?

Предоставьте пример кода, и мы сможем обнаружить проблему...

Ответ 3

Я и моя команда были сбиты с толку этой проблемой довольно давно. Мы пытались реализовать все, начиная с try-catch, наконец, до поддержки всех стандартов кодирования; однако эта проблема продолжалась каждый раз, когда несколько пользователей пытались получить доступ к странице одновременно. Соединение будет нарушено и возникнут проблемы. Иногда нам даже нужно перезагрузить весь сервер, чтобы приложение начало работать. Проблема заключалась в том, что мы не смогли ограничить использование пользователями одной и той же строки соединения, тем самым выбросив эту ошибку. В конечном итоге мы попытались открыть и закрыть строку соединения с помощью "use", ранее мы открывали и закрывали его вручную с помощью "dbcon.opne()" и "dbcon.close()" после того, как dataadapter смог получить данные.

Итак, что мы сделали, мы заменили одно и то же "использование", и это сохранил все в скобках.

, используя (DBConn = новое SqlConnection (ConfigurationManager.ConnectionStrings [ "DBConnect" ]. ConnectionString))          { код здесь            --- if (DBConn.State!= ConnectionState.Open)                   DBConn.Open();

}

Это полностью разрешило проблему.

Надеюсь, что это поможет.

Ответ 4

В .NET Core 2.0 или более поздней версии ошибка также может возникать, если в файле .csproj есть следующее:

 <ItemGroup>
   <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" /> 
 </ItemGroup> 

Согласно документации, этот параметр "позволяет вам удалить зависимости приложения от данных глобализации и поведения глобализации". Помимо меньшего размера файла, я не знаю, каковы преимущества этого, но SqlConnection не работает с ним.