Недавно мы столкнулись с проблемой, когда процесс, который обычно занимал секунды, чтобы выполнить один день, занимал час, а затем следующий день занял почти 9 часов. Это отдельная проблема, которую я также исследую, но проблема, о которой я хочу поговорить, заключается в том, что рассматриваемый запрос вызывался через Entity Framework с тайм-аутом 600 секунд, и когда процесс начинался долго, исключений тайм-аута не было. срабатывает.
В каждом экземпляре процесса, который выполняется долго, он, в конечном счете, успешно завершился без ошибок. Мы не перезаписываем ничего, что связано с DbContext, поэтому тайм-аут по умолчанию в 30 секунд все равно должен применяться.
Мы проверили, что запрос все еще выполняется, оценивая текущие выполнения на экземпляре SQL Server. Сначала я подумал, что запрос завершен, но глупость со столбцами Entity Key в классе сущности для этого представления заставила его проверяться вечно. В этом объекте есть только один столбец Entity Key, это PK основной таблицы представления. Мы также подтвердили, что набор данных не возвращал повторяющиеся записи. Таким образом, все указывает на тот факт, что запрос выполняется в течение всего процесса, а исключения тайм-аута не генерируются.
Кто-нибудь когда-либо испытывал такое с EF в своей среде?
Мы находимся на EntityFramework 6.1.3 и SQL Server Standard 2016 SP2 CU4.
ОБРАЗЕЦ КОДА:
EntitiesCommandTimeout = 600
if (ConfigurationManager.AppSettings.AllKeys.Contains("EntitiesCommandTimeout"))
{
_entitiesCommandTimeout = Convert.ToInt32(ConfigurationManager.AppSettings["EntitiesCommandTimeout"].ToString());
}
...
using (var db = new myContext())
{
db.Database.CommandTimeout = _entitiesCommandTimeout;
List<vwMyView> myViewItems = db.myView.Where(v => v.myColumn == myVariable).ToList();
}
ОБНОВЛЕНИЕ 2019-03-19:
Я забыл упомянуть, что когда один из моих разработчиков запустил этот процесс локально через Visual Studio и установил файл конфигурации, совпадающий с тем, что мы настроили в Prod, исключение тайм-аута было правильно запущено.