База данных Entity Framework 6.2 сначала прогревается - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть проект EF 6.2 в моем решении MVC.

В нем используется база данных SQL-сервера и около 40 таблиц с множеством внешних ключей.

Первый запрос очень медленный, 20с.

Я сразу же перехожу на ту же страницу, меняя пользовательский параметр, и запрос занимает менее 1 секунды.

Так что это похоже на проблему прогрева в EF6.Это нормально, и есть множество вещей, которые я могу сделать, по-видимому, для сортировки.

  1. Кэш модели (часть EF6.2) выглядит так, как будто это может быть полезным, но везде, где я читаю об этом, сначала указывается модель.Сначала ничего о БД.Будет ли это все еще работать с БД?
  2. Также есть мощные инструменты Entity Framework 6, которые позволяют мне генерировать представления.Пробовал это, и это, кажется, не имеет никакого значения.Это все еще действительный маршрут?
  3. Есть еще идеи?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Итак, ответом было обновить EF до 6.2, а затем использовать новейшую функцию:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration() : base()
    {
        var path = Path.GetDirectoryName(this.GetType().Assembly.Location);
        SetModelStore(new DefaultDbModelStore(path));
    }
}

для полной истории перейдите по этой ссылке: https://entityframework.net/why-first-query-slow

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

Для любого, кто использует веб-приложение Azure, вы можете использовать слот развертывания (https://stackify.com/azure-deployment-slots/),, что позволяет публиковать в непроизводственном режиме).слот затем прогрейте его, прежде чем заменить его в качестве рабочего слота.

0 голосов
/ 14 февраля 2019

EF DbContexts несут разовые затраты на разрешение сопоставлений их сущностей.Для веб-приложений вы можете уменьшить это, запустив ваше приложение, запустив простой запрос к DbContext, который «запускает» эту разминку, а не во время вашего первого запроса, инициируемого пользователем.Простое обновление контекста не запускает инициализацию, а выполнение запроса.Таким образом, для ASP.Net MVC на Application_Start, после инициализации всего:

using (var context = new MyContext())
{
   var warmup = context.MyTable.Count(); // against a small table.
}

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

...