Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Дисскусия про DI и контекст бд / 18 сообщений из 18, страница 1 из 1
17.02.2020, 13:36
    #39927456
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
Возник вопрос как бы, прилетело нежданно. Все мы регаем контекст базы данных(конекшен) на реквест если используем какой то DI.
так вот все прекрасно работает если ответы шустрые.
достался сервис старый который мы планово перевели на нет кор и конекшеном на реквест.
внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд.
это привело к тому что на пиковых нагрузках дергания этой команды я начал ловить в логах ошибку что не приложуха не может получить конекшен так как пул забит уже.

собственно сам диспут а стоит ли держать конешен к бд на ревест? дорогой ресурс вроде как и нужно на на команду.

п.с старый сервис собственно так и делал и поэтому и не видела раньше я такой ошибки.

п.с.пс. я конечно могу перевести на рельсы очереди и такого не будет но легкий осадок что как то не так остался.
...
Рейтинг: 0 / 0
17.02.2020, 14:54
    #39927509
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu,

хм, вроде как общепринятая практика - это открывать соединение на операцию, а не на реквест.

в той же документации по EF:
- The object context will open the connection if it is not already open before an operation.
If the object context opens the connection during an operation, it will always close the connection when the operation is complete.
- If you manually open the connection, the object context will not close it. Calling Close or Dispose will close the connection.
- If the object context creates the connection, the connection will always be disposed when the context is disposed.
- In a long-running object context, you must ensure that the context is disposed when it is no longer required.
- If you supply an open EntityConnection for the object context, you must ensure that it is disposed.
...
Рейтинг: 0 / 0
17.02.2020, 15:58
    #39927550
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA.
...
Рейтинг: 0 / 0
17.02.2020, 20:35
    #39927654
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
skyANA
handmadeFromRu,

хм, вроде как общепринятая практика - это открывать соединение на операцию, а не на реквест.

в той же документации по EF:
- The object context will open the connection if it is not already open before an operation.
If the object context opens the connection during an operation, it will always close the connection when the operation is complete.
- If you manually open the connection, the object context will not close it. Calling Close or Dispose will close the connection.
- If the object context creates the connection, the connection will always be disposed when the context is disposed.
- In a long-running object context, you must ensure that the context is disposed when it is no longer required.
- If you supply an open EntityConnection for the object context, you must ensure that it is disposed.


ну смотри вот мы закинули как скоуп(в вебе реквест является скоупом), других вариков нет( синглетон эт моветона, а транслет тут не катит так как то будет вызывать уничтожение). у меня команда делает n-запросов в бд...соединение будет на каждую команду открываться и закрываться? или же заинжектенный контекст бд уже несет открытое соединение (собственно я так и думаю) но не уверен и решил спросить у коллег.
...
Рейтинг: 0 / 0
17.02.2020, 20:38
    #39927656
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
fkthat
Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA.

ты плохо читаешь что я написал.. я регаю как надо вопрос в том если конекшен весит все время открытый, а ответе система обрабатывает на 4-6 секунд на реквест то при 300 рпс и выше дефотное колво конекшенов в пуле просто не хватает, оно не успевает вернуть изза этого. а если я не инжекчу контекст и а инжекчу репо, внутри репо оборачиваю в using на операцию - то не вижу этой проблемы уже.
...
Рейтинг: 0 / 0
17.02.2020, 20:40
    #39927658
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
skyANA или ты как то по другому предлагаешь контект еф прокидывать? я не уловил мысли. вот как ты на операцию его регаешь
...
Рейтинг: 0 / 0
17.02.2020, 21:10
    #39927665
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu,

поведение задокументировано:
- The object context will open the connection if it is not already open before an operation.
If the object context opens the connection during an operation, it will always close the connection when the operation is complete.
- If you manually open the connection, the object context will not close it. Calling Close or Dispose will close the connection.

если ты ручками не шаманишь, то соединение будет открываться на операцию, и проблем с выеданием пула не должно быть
...
Рейтинг: 0 / 0
17.02.2020, 21:16
    #39927667
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu
внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд

Тут не понятно, что есть команда и что значит внутри.
По мере чтения из базы ещё сторонний сервис вызывается?
...
Рейтинг: 0 / 0
17.02.2020, 21:34
    #39927673
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
skyANA

если ты ручками не шаманишь, то соединение будет открываться на операцию, и проблем с выеданием пула не должно быть

да оно закрывается я по дампу памяти смотрел все эт все ок просто не успевает на большом рпс изза ниже опишу
skyANA
handmadeFromRu
внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд

Тут не понятно, что есть команда и что значит внутри.
По мере чтения из базы ещё сторонний сервис вызывается?

ну смотри у меня приходит реквест сделайт что то

SomeCommandHandler{
SomeCommandHandler(DbContex db, sevice ...etc)
public Task Handle(T)
{
//что то подтягиваю чтоб провалидировать по бизнес правилам (оно может быть спрпятано в сервисах но так как контект скопотом то будем считать что вызов тут для наглядности)
db.Select()
db.Select()
remoteService.getData() // это к примеру 4-6 сек и на этот внешний(чужой) сервис я не могу влиять
db.Add or db.Update
}
}
вот примерно так выглядит щас как только нагрузка по колву реквестов начинает расти и достигает определеных цифр то соединения не успеваю освободиться изза вызова стороннего сервиса..за 4-5 секунду как ни как.
я же правильно понимаю что DbContext создает соединение на первый запрос в скоупе и потом не закрывает его до выхода из скойпа? отсюда и вопрос мой возник. щая я смотрю в сторону очереди и ограничить по сути использование конекшенов колво консумеров.
...
Рейтинг: 0 / 0
17.02.2020, 21:49
    #39927677
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu,

скопот, скоуп, скойп... :)
об чем речь? TransactionScope?
...
Рейтинг: 0 / 0
17.02.2020, 22:07
    #39927682
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
skyANA
handmadeFromRu,

скопот, скоуп, скойп... :)
об чем речь? TransactionScope?

речь идет о https://github.com/dotnet/efcore/blob/master/src/EFCore/Extensions/EntityFrameworkServiceCollectionExtensions.cs#L65

извини если запутал. мы говорим в контексте DI , время жизни без каких либо траназакций
...
Рейтинг: 0 / 0
18.02.2020, 14:26
    #39927975
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu,
Поставь уровень логирования "Debug" в настройках и пройди этот кусок кода в отладчике пошагово - в логах должно быть видно когда коннекшены открываются/закрываются. И, да, если у тебя все это выполняется в одной транзакции, то коннекшен действительно будет открыт до её завершения.
...
Рейтинг: 0 / 0
19.02.2020, 11:07
    #39928324
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
fkthat
handmadeFromRu,
Поставь уровень логирования "Debug" в настройках и пройди этот кусок кода в отладчике пошагово - в логах должно быть видно когда коннекшены открываются/закрываются. И, да, если у тебя все это выполняется в одной транзакции, то коннекшен действительно будет открыт до её завершения.

в логах нету окрытия или закрытия только сами запросы и время.
есть понятие db.Database.GetDbConnection().State но оно только тригерит когда руками открыли.
вообщем я не понял держит ли он конекшее или нет на время реквеста
...
Рейтинг: 0 / 0
19.02.2020, 11:52
    #39928353
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu
в логах нету окрытия или закрытия только сами запросы и время.

Пошамань с настройками логирования:

log-20200219.txt2020-02-19 11:25:29.091 +03:00 [DBG] Opening connection to database '***' on server '.\'.
2020-02-19 11:25:29.095 +03:00 [DBG] Opened connection to database '***' on server '.\'.
.....
.....
2020-02-19 11:25:29.274 +03:00 [DBG] Closing connection to database '***' on server '.\'.
2020-02-19 11:25:29.278 +03:00 [DBG] Closed connection to database '***' on server '.\'.
...
Рейтинг: 0 / 0
19.02.2020, 13:41
    #39928417
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
fkthat
handmadeFromRu
в логах нету окрытия или закрытия только сами запросы и время.

Пошамань с настройками логирования:

log-20200219.txt2020-02-19 11:25:29.091 +03:00 [DBG] Opening connection to database '***' on server '.\'.
2020-02-19 11:25:29.095 +03:00 [DBG] Opened connection to database '***' on server '.\'.
.....
.....
2020-02-19 11:25:29.274 +03:00 [DBG] Closing connection to database '***' on server '.\'.
2020-02-19 11:25:29.278 +03:00 [DBG] Closed connection to database '***' on server '.\'.

оу благодарствую, не знал что дебаг лог такое выдает. понял что на каждый вызов материлизации и изменения идет открытие и закрытие.
значит проблему в другом что у меня ошибка в лимитах конекшенов
...
Рейтинг: 0 / 0
21.02.2020, 10:04
    #39929308
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
...
Рейтинг: 0 / 0
21.02.2020, 12:24
    #39929390
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд

я такое делал с дапером и полли, тут под капотом также поли я смотрю( в сорсах поковырялся)
...
Рейтинг: 0 / 0
21.02.2020, 23:57
    #39929690
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дисскусия про DI и контекст бд
handmadeFromRu,

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


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