Как обрабатывать временные сбои в Entity Framework? - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы задать несколько вопросов. У меня есть некоторые исключения для сущностей.

Я использую Entity Framework 6.2.0 в своем приложении C# Windows и SQL Server 2017. Мое приложение работает с 8 клиентскими ПК и сервером.

Я действительно не знаю, как происходит это исключение. Это связано с тайм-аутом соединения? Как это исправить?

Я получаю это исключение:

System.Data.Entity.Core.EntityException: Возникло исключение, которое, вероятно, связано с временным сбоем.

Если вы подключаетесь к базе данных SQL Azure, рассмотрите возможность использования SqlAzureExecutionStrategy.

System.Data.Entity.Core.EntityCommandExecutionException: при выполнении определения команды произошла ошибка.
Подробности см. Во внутреннем исключении.

System.Data.SqlClient.SqlException: Транзакция (ID процесса 58) заблокирован при блокировке | ресурсы буфера связи с другим процессом и были выбраны в качестве жертвы тупика. Перезапустите транзакцию.

Код:

try
{
    using (DataCtx.RTAD_BusinessLicenseEntities ctx = new DataCtx.RTAD_BusinessLicenseEntities())
    {
        err = "if(rv.TransactionStatus)=>InsertMode: " + this.txtSearchNRC.Text + ", " + this.TransactionID + ", " + paraChalenNumber.Value.ToString();
        ctx.SP_Vehicle_ApproveForExtendOperatorLicense(Helper.convertToAnscii(this.txtSearchNRC.Text), this.TransactionID, paraChalenNumber, true, true, "Approved");
    }
}
catch (Exception ex)
{
    Helper.WriteErrorLog("User Input => " + err + "\n\n" + ex.ToString());
    MessageBox.Show(ex.ToString(), "btnApply_Click_Err", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

1 Ответ

0 голосов
/ 06 марта 2020

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

source : https://docs.microsoft.com/en-us/aspnet/aspnet/overview/developing-apps-with-windows-azure/building-real-world-cloud-apps-with-windows-azure/transient-fault-handling

Вот как это исправить с помощью EF 6:

// EF follows a Code based Configuration model and will look for a class that
// derives from DbConfiguration for executing any Connection Resiliency strategies
public class EFConfiguration : DbConfiguration
{
    public EFConfiguration()
    {
        AddExecutionStrategy(() => new SqlAzureExecutionStrategy());
    }
}
...