170 похожих чатов

Ребята, перевёл проект asp.net core 2.2 на dotnet 5.0. Сразу

столкнулся со снижением производительности всех API запросов в несколько раз! Подозрения падают на Dependency Injection. Используется встроенный IServiceCollection + AutoFac для расширенного функционала. Ниже три наблюдения:

1. Есть два разных класса DbContext. При инициализации обоих используются самописные DbConnectionOptionsReader, возвращающие connection string. Но для одного этот класс зареган как AddSingleton и простой запрос на этом DbContext (контекст.таблица.Count()) занимает 0.02 сек. На другом зареган как AddScoped и там такой же запрос занимает .25 сек - в 12 раз дольше! Если для эксперимента сделать второй тоже AddSingleton - то они начинают выполняться одинаково быстро

2. Создал новый dotnet 5.0 проект, скопипастил в него всё основное из первого проекта, чисто чтобы запустить тот же пример. Так вот пример отрабатывает одинаково быстро на обоих DbContext, независимо от того как зереганы их поставщики connection string - Singleton или Scoped. Это наводит на мысль, что скорость замедляют куча регистраций классов бизнес-логики в основном проекте. Или что-то другое.

3. После перевода на dotnet 5 проект иногда стал падать с ошибкой:

Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.EntityFrameworkCore.DbContextOptions`1[EsDb.DbContextRo])' on type 'DbContextRo'.
---> System.InvalidOperationException: An error was generated for warning 'Microsoft.EntityFrameworkCore.Infrastructure.ManyServiceProvidersCreatedWarning': More than twenty 'IServiceProvider' instances have been created for internal use by Entity Framework. This is commonly caused by injection of a new singleton service instance into every DbContext instance. For example, calling 'UseLoggerFactory' passing in a new instance each time--see https://go.microsoft.com/fwlink/?linkid=869049 for more details. This may lead to performance issues, consider reviewing calls on 'DbContextOptionsBuilder' that may require new service providers to be built. This exception can be suppressed or logged by passing event ID 'CoreEventId.ManyServiceProvidersCreatedWarning' to the 'ConfigureWarnings' method in 'DbContext.OnConfiguring' or 'AddDbContext'.

Что опять же намекает на проблему с DI, но я не понимаю причины этой ошибки. Написано, что это может быть вызвано из-за этого что мы используем Singleton'ы при создании DbContext, Но ведь, насколько я знаю, Singleton как раз и следует использовать, в этом случае экземпляр создаётся один раз на запрос, что повышает производительность, нежели чем создавать экземпляр один раз AddScoped или AddTransient. Или это намёк что вообще ничего не стоит инжектить в DbContext?

13 ответов

16 просмотров

а энтити фреймворк где зареган? внутри автофака или мс ди?

Dmitry-B. Автор вопроса
Viktor Svyatokha
а энтити фреймворк где зареган? внутри автофака ил...

DbContext зареган на IServiceCollection ServiceCollection.AddDbContext(вызов_функции_резолвящей_DbConnectionOptionsReader) ServiceCollection.AddDbContextFactory(вызов_функции_резолвящей_DbConnectionOptionsReader) DbConnectionOptionsReader тоже зареган на IServiceCollection

Dmitry B.
DbContext зареган на IServiceCollection ServiceCol...

А перекинь его на автофак и попробуй; такое ощущение, что автофак где-то лишнее создает, судя по сообщению из ошибки

Dmitry-B. Автор вопроса
Viktor Svyatokha
А перекинь его на автофак и попробуй; такое ощущен...

попробовал зарегать в автофак (убрав регистрацию из IServiceColleciton) - никак не поменяло время выполнения

контекст ты как синглетон регаешь ?

Dmitry-B. Автор вопроса

А что профайлер говорит?

Dmitry-B. Автор вопроса
Иван
А что профайлер говорит?

не проясняет ситуации, просто замедление в несколько раз и всё тут

попробуй выпилить AutoFac

Dmitry-B. Автор вопроса
Arthur Irgashev
попробуй выпилить AutoFac

у нас весомая логика связана на его ILifetimeScope и ParentScope, малой кровью не отделаешься, так что это вариант лишь на перспективу

Проблемы очевидно в DI скоупах, думаю автофак обходит дефолтную валидацию и начинается цирк с зависимостями от неправильных лайфтаймов. Два варианта есть: выпилить автофак; выпилить инъекцию DbContext, заменить ее на фабрику, надеюсь она не используется как UnitOfWork. Быстрого решения проблемы нет.

Dmitry-B. Автор вопроса
βλαδιμιρ
Проблемы очевидно в DI скоупах, думаю автофак обхо...

вот ещё сравнение вызовов на проектах без проблемы и с проблемой. Как видно, всё одинаково до GetRequiredService, дальше уже начинается сильное расхождение

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Карта сайта