Сбой процесса .NET Core из-за исключения пула соединений SQL - PullRequest
0 голосов
/ 06 ноября 2018

Я недавно перенес приложение .NET Framework 4.6.1 в .NET Core 2.1, и процесс завершается сбоем, когда база данных SQL AZure становится недоступной. Процесс выполняется в Windows как служба.

Сама проблема - не исключение (это ожидаемое условие SQL Azure ), а тот факт, что я не могу обработать исключение, поскольку оно не встречается в моем коде напрямую. Кажется, исключение происходит в пуле соединений SQL.

Я собрал трассировку стека ниже, прослушав событие AppDomain.CurrentDomain.UnhandledException:

System.Data.SqlClient.SqlException (0x80131904): База данных «XXXXXX» на сервере «XXXXXX» в настоящее время недоступна. Пожалуйста, повторите попытку позже. Если проблема не устраняется, обратитесь в службу поддержки клиентов и предоставьте им идентификатор трассировки сеанса «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX». в новой версии System.Data.SqlClient.SqlInternalConnectionTds (идентификатор DbConnectionPoolIdentity, SqlConnectionString connectionOptions, объект providerInfo, bool redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, bool applyHandTling ApplicationDransient) в DbConnectionInternal System.Data.SqlClient.SqlConnectionFactory.CreateConnection (параметры DbConnectionOptions, DbConnectionPoolKey poolKey, объект poolGroupProviderInfo, пул DbConnectionPool, DbConnection owningConnection, DbConptions) в DbConnectionInternal System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection (пул DbConnectionPool, параметры DbConnection owningObject, DbConnectionOptions, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) в DbConnectionInternal System.Data.ProviderBase.DbConnectionPool.CreateObject (DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) в пустом System.Data.ProviderBase.DbConnectionPool.PoolCreateRequest (состояние объекта) в bool System.Threading.ThreadPoolWorkQueue.Dispatch () ClientConnectionId: 3873debc-b302-44f5-820a-8f760b1634e3 Номер ошибки: 40613, состояние: 1, класс: 14

Это не новый код, и поведение кажется другим при работе в .NET Framework, где процесс не останавливался.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Если ваша клиентская программа подключается к базе данных SQL с помощью класса .NET Framework System.Data.SqlClient.SqlConnection, используйте .NET 4.6.1 или более позднюю версию (или .NET Core), чтобы вы могли использовать повтор соединения особенность. Дополнительную информацию об этой функции см. На этой веб-странице.

Когда вы строите строку соединения для вашего объекта SqlConnection, координируйте значения среди следующих параметров:

ConnectRetryCount: по умолчанию 1. Диапазон от 0 до 255.

ConnectRetryInterval: по умолчанию 1 секунда. Диапазон от 1 до 60.

Время ожидания подключения: по умолчанию 15 секунд. Диапазон от 0 до 2147483647.

В частности, выбранные вами значения должны обеспечивать равенство:

Время ожидания подключения = ConnectRetryCount * ConnectionRetryInterval

Например, если количество равно 3, а интервал равен 10 секундам, тайм-аут, равный только 29 секундам, не дает системе достаточно времени для подключения к третьей и последней повторной попытке: 29 <3 * 10. </p>

Подробнее: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues#net-sqlconnection-parameters-for-connection-retry

Или установите Polly.Net:

Install-Package Polly

Подробнее об этом можно узнать на их GitHub: https://github.com/App-vNext/Polly

0 голосов
/ 06 ноября 2018

Причина в том, что в пакете System.Data.SqlClient есть ошибка для версий до 4.5.0

https://github.com/dotnet/corefx/issues/14615#issuecomment-389248862

...