Внутренняя фатальная ошибка соединения
Недавно я начал получать эту ошибку: "Внутренняя фатальная ошибка соединения" из моего приложения. Ошибка возникает случайным образом. Когда это произойдет, мое приложение неприменимо в течение следующих нескольких минут.
После тщательного анализа ошибки я пришел к выводу, что эта ошибка происходит только в одном методе в моем приложении. Этот метод запускает ряд простых обычных 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 не работает с ним.