|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
Возник вопрос как бы, прилетело нежданно. Все мы регаем контекст базы данных(конекшен) на реквест если используем какой то DI. так вот все прекрасно работает если ответы шустрые. достался сервис старый который мы планово перевели на нет кор и конекшеном на реквест. внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд. это привело к тому что на пиковых нагрузках дергания этой команды я начал ловить в логах ошибку что не приложуха не может получить конекшен так как пул забит уже. собственно сам диспут а стоит ли держать конешен к бд на ревест? дорогой ресурс вроде как и нужно на на команду. п.с старый сервис собственно так и делал и поэтому и не видела раньше я такой ошибки. п.с.пс. я конечно могу перевести на рельсы очереди и такого не будет но легкий осадок что как то не так остался. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 13:36 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 14:54 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 15:58 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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-запросов в бд...соединение будет на каждую команду открываться и закрываться? или же заинжектенный контекст бд уже несет открытое соединение (собственно я так и думаю) но не уверен и решил спросить у коллег. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 20:35 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
fkthat Если ты как "по учебнику" в коре регаешь контектс через services.AddDbContext<FooContext>() а потом инжектишь непосредственно сам FooContext, то все должно быть ок. Инстанс контекста будет (по умолчанию) один для всего времени жизни реквеста, а коннекшен будет открываться и закрываться сам когда надо, как выше написал skyANA. ты плохо читаешь что я написал.. я регаю как надо вопрос в том если конекшен весит все время открытый, а ответе система обрабатывает на 4-6 секунд на реквест то при 300 рпс и выше дефотное колво конекшенов в пуле просто не хватает, оно не успевает вернуть изза этого. а если я не инжекчу контекст и а инжекчу репо, внутри репо оборачиваю в using на операцию - то не вижу этой проблемы уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 20:38 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
skyANA или ты как то по другому предлагаешь контект еф прокидывать? я не уловил мысли. вот как ты на операцию его регаешь ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 20:40 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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. если ты ручками не шаманишь, то соединение будет открываться на операцию, и проблем с выеданием пула не должно быть ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 21:10 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
handmadeFromRu внутри одной команды есть вызов другого стороннего сервиса который отвечает в районе 4-6 секунд Тут не понятно, что есть команда и что значит внутри. По мере чтения из базы ещё сторонний сервис вызывается? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 21:16 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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 создает соединение на первый запрос в скоупе и потом не закрывает его до выхода из скойпа? отсюда и вопрос мой возник. щая я смотрю в сторону очереди и ограничить по сути использование конекшенов колво консумеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 21:34 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
handmadeFromRu, скопот, скоуп, скойп... :) об чем речь? TransactionScope? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 21:49 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
skyANA handmadeFromRu, скопот, скоуп, скойп... :) об чем речь? TransactionScope? речь идет о https://github.com/dotnet/efcore/blob/master/src/EFCore/Extensions/EntityFrameworkServiceCollectionExtensions.cs#L65 извини если запутал. мы говорим в контексте DI , время жизни без каких либо траназакций ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 22:07 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
handmadeFromRu, Поставь уровень логирования "Debug" в настройках и пройди этот кусок кода в отладчике пошагово - в логах должно быть видно когда коннекшены открываются/закрываются. И, да, если у тебя все это выполняется в одной транзакции, то коннекшен действительно будет открыт до её завершения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2020, 14:26 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
fkthat handmadeFromRu, Поставь уровень логирования "Debug" в настройках и пройди этот кусок кода в отладчике пошагово - в логах должно быть видно когда коннекшены открываются/закрываются. И, да, если у тебя все это выполняется в одной транзакции, то коннекшен действительно будет открыт до её завершения. в логах нету окрытия или закрытия только сами запросы и время. есть понятие db.Database.GetDbConnection().State но оно только тригерит когда руками открыли. вообщем я не понял держит ли он конекшее или нет на время реквеста ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 11:07 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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 '.\'. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 11:52 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
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 '.\'. оу благодарствую, не знал что дебаг лог такое выдает. понял что на каждый вызов материлизации и изменения идет открытие и закрытие. значит проблему в другом что у меня ошибка в лимитах конекшенов ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2020, 13:41 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
handmadeFromRu, початай ещё вот это https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2020, 10:04 |
|
Дисскусия про DI и контекст бд
|
|||
---|---|---|---|
#18+
hVostt я такое делал с дапером и полли, тут под капотом также поли я смотрю( в сорсах поковырялся) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2020, 12:24 |
|
|
start [/forum/topic.php?fid=18&fpage=9&tid=1354768]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 197ms |
0 / 0 |