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

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

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

п.с.пс. я конечно могу перевести на рельсы очереди и такого не будет но легкий осадок что как то не так остался.
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927509
Фотография 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.
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927550
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA.
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927654
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дисскусия про DI и контекст бд
    #39927656
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA.

ты плохо читаешь что я написал.. я регаю как надо вопрос в том если конекшен весит все время открытый, а ответе система обрабатывает на 4-6 секунд на реквест то при 300 рпс и выше дефотное колво конекшенов в пуле просто не хватает, оно не успевает вернуть изза этого. а если я не инжекчу контекст и а инжекчу репо, внутри репо оборачиваю в using на операцию - то не вижу этой проблемы уже.
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927658
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA или ты как то по другому предлагаешь контект еф прокидывать? я не уловил мысли. вот как ты на операцию его регаешь
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927665
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дисскусия про DI и контекст бд
    #39927667
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд

Тут не понятно, что есть команда и что значит внутри.
По мере чтения из базы ещё сторонний сервис вызывается?
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39927673
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дисскусия про DI и контекст бд
    #39927677
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

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

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

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

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

в логах нету окрытия или закрытия только сами запросы и время.
есть понятие db.Database.GetDbConnection().State но оно только тригерит когда руками открыли.
вообщем я не понял держит ли он конекшее или нет на время реквеста
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39928353
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
Дисскусия про DI и контекст бд
    #39928417
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Дисскусия про DI и контекст бд
    #39929308
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Дисскусия про DI и контекст бд
    #39929390
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

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

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


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