Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / inject container self to service / 20 сообщений из 20, страница 1 из 1
20.02.2018, 14:07
    #39604801
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Почему поднялся вопрос. может кто то отговорит.
вообщем сделал сервис с массовой загрузкой ef летает все ок. загружаем по 100 записей и потом их отправляем в бд(всего записей около 100к и фоном грузится в джобе).
схематично код

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Importer
{
  private IRepo _repo;

  public Importer(IRepo repo)
  {
    _repo = repo;
  }

  public void Process (...)
  {
    while(contion)
    {
     var flag = repo.Where(condition).tolist();
     if (flag)
     {
       _repo.AddRange();
       _repo.CommitAsync();
     }
   }
 }
}


все летает до ориентировочно 200 итерации, вставка 100 записей и получение флага до 100мс, после начинает трабла и операция получения flag тормозит до 2 минут и потом снова быстрая вставка. Кто то скажет что ef не для массовых вставок и я соглашусь. Но если пересоздавать контекст на каждую вставку проблем уже нет. Поэтому я подумал как завести сам контейнер в сервис и руками резолвить инстанс репозитория на каждую итерацию. конечно переписать на нативный скул не проблема, но пока хочется остаться на орм. Что то типо такого
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public void Process (...){

while(contion){
_repo = resolver.Resolve<IRepo >();
 var flag = _repo.Where(condition).tolist();
 if (flag)
  {
     _repo.AddRange();
     _repo.CommitAsync();
     _repo.Dispoce();
   }
 }
}


или я делаю очень плохое решение? и да я не совсем понимаю как зарегать контейнер .. регистрация в одной точке на уровне приложения, а сервисы на уровне бизнес-логики.
...
Рейтинг: 0 / 0
20.02.2018, 15:48
    #39604905
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,
Не делают орм для простых инсерт. Оно вам надо? Долго переписать?
Ну и где лог запроса который тормозит? Что именно 2 минуты делается?
3. Там вроде флаг есть в ef выкл трекера....
...
Рейтинг: 0 / 0
20.02.2018, 15:49
    #39604906
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,

Отключай трекинг.
...
Рейтинг: 0 / 0
20.02.2018, 16:19
    #39604941
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123handmadeFromRu,
Не делают орм для простых инсерт. Оно вам надо? Долго переписать?


не особо так как дженерик репо, просто подсунуть другую реализацию через тот же дапер. просто пока хотел в одном стиле пока возможно.

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

вообщем заводить контейнер внутрь сервиса плохая идея?
...
Рейтинг: 0 / 0
20.02.2018, 16:57
    #39604966
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,

resolver внутрь сервиса? конечно плохая, инжектировать через конструктор -- хорошая идея )
...
Рейтинг: 0 / 0
20.02.2018, 17:14
    #39604987
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,
Логирование, логи, отладка, профилрование.
Выясни чем занят комп 2 мин. Какой был запрос перед зависанием?
Это наша работа.
...
Рейтинг: 0 / 0
20.02.2018, 21:32
    #39605121
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
hVostthandmadeFromRu,

resolver внутрь сервиса? конечно плохая, инжектировать через конструктор -- хорошая идея )

конечно через конструктор и только через него. но тут пришла идея сделать это через такое в dryioc
Код: c#
1.
2.
3.
public Class(Func<IRepo> repoFactory) {
    var repo = repoFactory();
}


чтоб вызывать новый просто выполняю функтор должно сработать. Просто не хотел некией интерфейс IResolver прокидывать на уровень сервисов.
...
Рейтинг: 0 / 0
20.02.2018, 21:36
    #39605122
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123handmadeFromRu,
Логирование, логи, отладка, профилрование.
Выясни чем занят комп 2 мин. Какой был запрос перед зависанием?
Это наша работа.

да я понимаю, покрыл по тупому стовотчами и в логфайл, как раз на получение списка из бд висело. хотя судя по sql профилировщику всего 30мс запрос на чтение было. проблема вскрылась именно на продакшине. тесты легко проходили не сразу заметили медленность фонового процесса.
...
Рейтинг: 0 / 0
20.02.2018, 23:08
    #39605142
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,
Ну дак трекинг отключили и без изменений?
Потом, вы же можете после пачки по 100 штук пересоздать контекст, а не после каждой вставки.
Потом, можно сделать тест вставки отдельно от проекта, и прогнать для уточнения ситуации.
...
Рейтинг: 0 / 0
21.02.2018, 08:03
    #39605235
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRuчтоб вызывать новый просто выполняю функтор должно сработать. Просто не хотел некией интерфейс IResolver прокидывать на уровень сервисов.

а зачем новый? как регистрируешь?
...
Рейтинг: 0 / 0
21.02.2018, 08:16
    #39605242
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123handmadeFromRu,
Ну дак трекинг отключили и без изменений?
Потом, вы же можете после пачки по 100 штук пересоздать контекст, а не после каждой вставки.
Потом, можно сделать тест вставки отдельно от проекта, и прогнать для уточнения ситуации.
да я ж писал на вставку у меня нет трекинга, трекинг только для update. и там есть апрдей одной сущности.
да я и делал вставку по 100 штук. перешел к идее пересоздания контекта и эт основой вопрос ж мой был)
...
Рейтинг: 0 / 0
21.02.2018, 08:21
    #39605246
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
hVosttа зачем новый? как регистрируешь?
чтоб пересоздать контекст, регистрирую как обычно
Код: c#
1.
2.
3.
4.
5.
6.
        public static void Register(this IContainer builder)
        {
            builder.Register(typeof(IUnitOfWork<>), typeof(UnitOfWork<>), reuse: Reuse.InWebRequest);
            builder.Register(typeof(IContextRepository<,,>), typeof(EfRepository<,,>), reuse: Reuse.InWebRequest);
            ...
         }


почитал доку dryioc и он может вернуть функтор на создание нового объекта со всеми зависимости. то что надо

п.с. правда я все ж думаю сделать репозиторий через дапер на случай такие
...
Рейтинг: 0 / 0
21.02.2018, 12:06
    #39605400
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRuчтоб пересоздать контекст, регистрирую как обычно

эт странно. если ты пересоздаёшь контекст в одном скоупе, а потом вызываешь у IUnitOfWork.Save, где и что сохраняется?

смысл плодить инстансы репо? очень странное решение :)
...
Рейтинг: 0 / 0
21.02.2018, 13:01
    #39605453
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
hVosttэт странно. если ты пересоздаёшь контекст в одном скоупе, а потом вызываешь у IUnitOfWork.Save, где и что сохраняется?

смысл плодить инстансы репо? очень странное решение :)

ну я вроде и спрашиваю как лучше сделать) а поп поводу твоих вопрос то IUnitOfWork.Save, сохраняте пачками в моем случае по 100 штук + пара полей другой сущности обновляет в бд. если что то случиться такое не откатить уже конечно
...
Рейтинг: 0 / 0
21.02.2018, 13:42
    #39605491
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,

ef extensions bulk
...
Рейтинг: 0 / 0
21.02.2018, 14:11
    #39605528
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123handmadeFromRu,

ef extensions bulk
пробовал также минусы что и у пересоздания контекста. а так да шустренько.
...
Рейтинг: 0 / 0
21.02.2018, 14:16
    #39605533
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu,
Что за минусы? Он специально для вставки по несколько штук записей.
...
Рейтинг: 0 / 0
21.02.2018, 14:52
    #39605563
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123handmadeFromRu,
Что за минусы? Он специально для вставки по несколько штук записей.
1 транзакцией провести?
и чет дохера http://joxi.ru/4Ak00oKFyONGqr
...
Рейтинг: 0 / 0
21.02.2018, 15:20
    #39605580
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
handmadeFromRu, Платный?
))
Фигово.
А ef utilites?
...
Рейтинг: 0 / 0
21.02.2018, 15:46
    #39605592
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
inject container self to service
Petro123 жизнь боль и нет поддержки core net,
Bulk Insert Library

There is three major library supporting Bulk Insert:

Entity Framework Extensions (Paid but supported)
EntityFramework.BulkInsert (No longer supported)
EFUtilities (No longer supported)

пока вопрос закрыт в таком виде.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / inject container self to service / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]