Entity Framework 6.2 очень медленный первый запуск и EFInteractiveViews - PullRequest
0 голосов
/ 18 сентября 2018

эта тема уже широко обсуждается в stackoverflow и во многих других блогах, причина для того, чтобы задать вопрос, заключается в том, что я наблюдаю, что эта тема обсуждалась в основном в сообщениях от 3 до 5 лет, тогда как сейчас у нас есть версия EF 6.2, и я ожидаю, что это может иметьобновления (есть и другие причины, которые вы найдете в вопросе.

Мое приложение имеет как минимум 25 моделей (таблиц) с MySQL в качестве базы данных, модели и отношения настроены в OnModelCreating, веб-сайт размещен на godaddy, и яне имеют хорошего доступа к настройкам IIS и т. д.

Время загрузки страницы

  • Загрузка первой страницы: от 65 до 70 секунд
  • Загрузка второй страницы: от 1 до 3 секунд

После 10-минутной задержки загрузка страницы займет 70 секунд. Обратите внимание, что я тестировал ее в разных средах, например, при использовании другого подключения к Интернету. На странице нет ни одной фотографии, и тестовой страницыимеет только 5 строк данных с двумя столбцами (вызывая простой метод db.Test.ToList ();)

Пока sВ интернете я обнаружил, что это обычная проблема с EF, поэтому я попытался исправить ее, получая помощь от сообщений 3 шага для быстрого EntityFramework и Предварительно сгенерировать модель и кэш представления

После этого исправления

  • Загрузка первой страницы: от 64 до 67 секунд
  • Загрузка второй страницы: от 1 до 3 секунд

    // DbConfiguration constructor
    public MyDbConfiguration
    {
         var path = Path.GetDirectoryName(this.GetType().Assembly.Location);
         SetModelStore(new DefaultDbModelStore(path));
    }
    
    // DbContext
    private static DbMappingViewCacheFactory viewCacheFactory;
    
    private static DbMappingViewCacheFactory ViewCacheFactory
    {
        get
        {
            if (viewCacheFactory == null)
            {
                var path =ConfigurationManager.AppSettings[GlobalContextConfig.EFCacheFolder];
                viewCacheFactory=new FileViewCacheFactory(path+"Budget.Context.MyDbContext.xml");
            }
            return viewCacheFactory;
        }
    }
    
    
    public MyDbContext()
        : base("name=MySqlConnectionString")
    {
         // In case i need to update xml for now i delete the old file manually 
        InteractiveViews.SetViewCacheFactory(this, ViewCacheFactory);
    
        Database.SetInitializer<MyDbContext>(null);
    
        this.Configuration.ProxyCreationEnabled = false;
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.AutoDetectChangesEnabled = false;
        this.Configuration.ValidateOnSaveEnabled = false;
    }
    

Это было улучшено, но не достаточно, я хочу знать, были ли обновлены эти проблемы в EF 6.2.0 или изменился метод их исправления, или что-то, что я делаю неправильно / должен проверить.

Я также установилEF 6.1.X и сгенерированные представления, щелкнув правой кнопкой мыши файл Contaxt и выбрав Entity Framework> Generate View в руководстве

Результаты:

  • Загрузка первой страницы: от 40 до 50 секунд
  • Загрузка второй страницы: от 0 до 1,5 секунд

Это удивительно, EF 6.1.X намного быстрее, чем EF 6.2

Сборка и развертывание в виде пакета Release с debug = false

Для целей тестирования я также загрузил приложение asp.netбез Entity Framework загрузка в первый раз занимает от 8 до 13 секунд, а вторая загрузка занимает менее 1 секунды

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Полагаю, вы прочитали замечания по производительности:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/performance-considerations

Я лично тоже борюсь с этими проблемами. Я прибег к а) создание собственного SQL для некоторых запросов . и б) я создал механизм разминки. Существует также возможность предварительно скомпилировать запросы, которые могут помочь.

Механизм прогрева запускается при запуске приложения в отдельном потоке. Там он делает очень простой запрос к базе данных, это вызывает создание модели и «запускает» начальную задержку запуска для всех запросов. После выполнения этого запроса (это занимает пару секунд) устанавливается флаг. Все остальные операции ожидают установки флага перед запуском. Особенно в многопоточном сценарии это очень помогает.

Я обнаружил, что задержка запуска была создана для каждого потока. Это означает, что если задержка составляет, скажем, 2 секунды, запустив 3 потока, которые все создают контекст и пытаются запустить какой-нибудь linq, заставьте все приложение ждать 6 секунд .

Обратите внимание, что при создании пользовательских запросов необходимо возвращать все поля для создаваемой сущности;

    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList(); //works
    var blogs = context.Blogs.SqlQuery("SELECT [id] FROM dbo.Blogs").ToList(); //Does not.

Я не проверил этот вопрос полностью - так что потратьте некоторое время на тестирование. Это всего лишь один на один.

0 голосов
/ 19 сентября 2018

Я хочу знать, обновлены ли эти проблемы в EF 6.2.0 или изменился ли метод их исправления, или что-то, что я делаю неправильно / должен проверить.

Ответ таков:да,

EF 6.2 представила кэш модели

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

[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyContextContext : DbContext 
{
}

Подробнее можно узнать здесь: https://codeopinion.com/entity-framework-code-first-model-cache/

...