русский
Germany.ruForen → Архив Досок→ Programmierung

предпочтения по количеству соединений с БД

800  1 2 alle
AlexNek патриот09.05.23 18:40
AlexNek
09.05.23 18:40 

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


итак есть:DBContext и сессия пользователя

контекст можно открывать один раз на сессию(1) или каждый раз на операцию/транзакцию (2)

Возникло всё - из примерно следующей проблемы /просто как понятный пример/ - компонент перед отрисовкой загружает данные асинхронно.

Но вот вместо одной отрисовки он делает 2, при этом, при первой отрисовке он начинает грузить данные с базы, тут же начинает вторую отрисовку и начинает грузить те же самые данные опять. Контексту это не нравится и вылетает исключение. И предложено при каждой загрузке данных "открывать коннект" к базе по новому. И сделать это абсолютно везде.

#1 
alex445 коренной житель09.05.23 19:26
NEW 09.05.23 19:26 
in Antwort AlexNek 09.05.23 18:40

Как где удобно, так и делайте. EF ещё содержит в себе паттерн unit of work, и если вы будете слишком часто использовать новый контекст или закрывать старый, вместо того, чтобы всё в одном делать, то лишитесь этого паттерна. Но если он и не нужен или удобнее использовать короткоживущие контексты, то и фиг с ним.

#2 
AlexNek патриот09.05.23 19:41
AlexNek
NEW 09.05.23 19:41 
in Antwort alex445 09.05.23 19:26

предлагают так, ну и похоже понятие открытие/закрытие отличается от того, что предполагалось.

https://learn.microsoft.com/en-us/aspnet/core/blazor/blazo...

#3 
Murr патриот10.05.23 03:15
Murr
NEW 10.05.23 03:15 
in Antwort AlexNek 09.05.23 18:40

контекст можно открывать один раз на сессию(1)

или

каждый раз на операцию/транзакцию (2)

-----

По затратам - почти невесомая операция - заполненная структура в памяти.

Более существенно на что она опирается при коннекте к базе - эта операция затратная.

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

По мелкомягкому - не помню, но думаю что примерно так же.

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

#4 
AlexNek патриот10.05.23 19:46
AlexNek
NEW 10.05.23 19:46 
in Antwort Murr 10.05.23 03:15

В итоге оказалось проще, нашлось отчего происходит слишком много обновлений - бойтесь CascadedParameters смущ

#5 
alex445 коренной житель10.05.23 20:46
NEW 10.05.23 20:46 
in Antwort AlexNek 10.05.23 19:46

Вы через них контекст передавали?

#6 
AlexNek патриот10.05.23 22:04
AlexNek
NEW 10.05.23 22:04 
in Antwort alex445 10.05.23 20:46
Вы через них контекст передавали?

нет конечно, он через DI

народ просто хотел грузануть еще дополнительные данные из базы по изменению параметров.

А там получается так, с интервалом в десятки мс: параметр равен нулю (1), список с х элементами (2), список с х элементами (3). А базе нужно хотя бы сотню мс для чтения.

По честному должно быть только 1 и 2. 1 - не интересует, 2 читаем что надо. 3 - совершенно лишнее, но оно инициировало чтение также.

#7 
alex445 коренной житель11.05.23 14:33
NEW 11.05.23 14:33 
in Antwort AlexNek 10.05.23 22:04, Zuletzt geändert 11.05.23 14:46 (alex445)

А чего это вы всё чаще с Блейзором связываетесь? Вы же сказали, что отказались от него, т.к. Реакт и Ангуляр луТше?

#8 
AlexNek патриот11.05.23 19:09
AlexNek
NEW 11.05.23 19:09 
in Antwort alex445 11.05.23 14:33
Вы же сказали, что отказались от него

Не следует смешивать разные проекты. То был клиент с PWA, а это сервер.

А еще есть и валом других, так что не нужно удивлятся.

#9 
alex445 коренной житель12.05.23 00:34
NEW 12.05.23 00:34 
in Antwort AlexNek 11.05.23 19:09

В смысле "сервер"? А есть Блейзор-проекты, где на Блейзоре лишь серверная часть?

#10 
AlexNek патриот12.05.23 18:25
AlexNek
NEW 12.05.23 18:25 
in Antwort alex445 12.05.23 00:34
alex445 коренной житель12.05.23 18:47
NEW 12.05.23 18:47 
in Antwort AlexNek 12.05.23 18:25

Это всё понятно, но гуй-то в любом случае формируется Блейзором. Или вы можете как-то прикрутить тот же Ангуляр к блейзоровским компонентам? А как это выглядит и смысл в этой химере? Блейзор же был сделан в том числе как замена джаваскриптовому слою на клиенте. Если вам по-прежнему нужны js-спагетти для view model, то смысла использовать Блейзор нет.

#12 
AlexNek патриот12.05.23 23:33
AlexNek
NEW 12.05.23 23:33 
in Antwort alex445 12.05.23 18:47
но гуй-то в любом случае формируется Блейзором

естественно


Что конкретно непонятно?


Если вам по-прежнему нужны js-спагетти для view model,

Зачем? Есть маленький кусок JS для смены фокуса, может еще какая то мелочь

#13 
alex445 коренной житель13.05.23 11:02
NEW 13.05.23 11:02 
in Antwort AlexNek 12.05.23 23:33, Zuletzt geändert 13.05.23 11:10 (alex445)

Там же для фокуса другую штуку сделали, зачем джаваскрипт? Забудьте про него. У меня в проекте есть лишь одна функция на нём, которую я написал сам стянул - сформировать файл из готового контента и скачать его. Строчек 6-7. Да и то лишь потому, что иначе браузер не даёт качать файлы.

#14 
AlexNek патриот13.05.23 11:20
AlexNek
NEW 13.05.23 11:20 
in Antwort alex445 13.05.23 11:02
Там же для фокуса другую штуку сделал

Ну давайте для динамически создаваемой формы переместите фокус на любой элемент по ИД с помощью этой штуки. Сказать сколько это будет строк на JS?

#15 
AlexNek патриот13.05.23 13:43
AlexNek
NEW 13.05.23 13:43 
in Antwort alex445 13.05.23 11:02

Вот как бы загадка. Есть Блазор код, TestComponent только логирует вызов фунций внутри себя и имеет CascadingParameter. /*Это коммент должен быть '//var _forecasts' как коммент, следующий вопрос, что будет в выводе с данной строкой без коммента?*/


<button @onclick="OnRefresh">Refresh</button>
<CascadingValue Value="@_forecasts">
    <TestComponent></TestComponent>
</CascadingValue>
@code{
 private WeatherForecast[]? _forecasts;
    protected override async Task OnInitializedAsync()
    {
        Console.WriteLine("---Main component loading shared data---");
        _forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    }
    private async Task OnRefresh()
    {
        Console.WriteLine("---Pressed button Refresh---");
        await Task.Delay(200);
        //var _forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    }
}

Вопрос: Что можно увидеть в логах?

#16 
AlexNek патриот13.05.23 13:46
AlexNek
NEW 13.05.23 13:46 
in Antwort AlexNek 13.05.23 13:43

Вот важная часть TestComponent

@code {
    [CascadingParameter]
    private WeatherForecast[]? Forecasts { get; set; }
    
    protected override async Task OnInitializedAsync()
    {
        Console.WriteLine("OnInitializedAsync");
        await base.OnInitializedAsync();
    }

    public override async Task SetParametersAsync(ParameterView parameters)
    {
        var objects = parameters.ToDictionary();
        string parDescription = String.Join(", ",objects);
        Console.WriteLine($"set:{parDescription}");
        await base.SetParametersAsync(parameters);
    }

    protected override async Task OnParametersSetAsync()
    {
        Console.WriteLine("OnParametersSetAsync enter");
        await base.OnParametersSetAsync();
        // simulate some work
        await Task.Delay(250);
        Console.WriteLine("OnParametersSetAsync exit");
    }
}
#17 
alex445 коренной житель13.05.23 14:43
NEW 13.05.23 14:43 
in Antwort AlexNek 13.05.23 11:20, Zuletzt geändert 13.05.23 14:46 (alex445)
Ну давайте для динамически создаваемой формы переместите фокус на любой элемент по ИД с помощью этой штуки. Сказать сколько это будет строк на JS?

Динамически в смысле на джаваскрипте? Тогда сами себе проблемы создаёте - только с джаваскриптом и работайте.


А если через SignalR, то просто отсылаете новый запрос на обновление формы или её контрола, он себя перестраивает, и там уже ставите фокус куда вам надо.


Что за навязчивые попытки скрестить ежа с ужом? Вы либо дальше скриптизируете со всеми такими из себя динамическими вью моделями на JS, либо переходите на Блейзор целиком. Химеры это всегда проблемы и ненужная мешанина из технологий.


С каскадными параметрами ещё толком не работал, поэтому ничего сказать не могу.

#18 
AlexNek патриот13.05.23 16:03
AlexNek
NEW 13.05.23 16:03 
in Antwort alex445 13.05.23 14:43
Динамически в смысле на джаваскрипте?

не что за болезнь такая везде его видеть?

Динамически в смысле форма создается по скрипту (не ява!!!)

Вот пример:

Текст х1

Чекбокс х2 ("синий", "зеленый")

@if x1==1 then x2=0

#19 
AlexNek патриот13.05.23 16:23
AlexNek
NEW 13.05.23 16:23 
in Antwort alex445 13.05.23 14:43
то просто отсылаете новый запрос на обновление формы

Самому не смешно?

Попробуете ввести данные в первое поле а затем сделать обновление страницы

https://demos.devexpress.com/blazor/Editors


Но предлагаю начать с вышеприведенной задачи смущ

#20 
alex445 коренной житель13.05.23 16:35
NEW 13.05.23 16:35 
in Antwort AlexNek 13.05.23 16:23, Zuletzt geändert 13.05.23 16:57 (alex445)

Что-то типа такого?

https://learn.microsoft.com/en-us/aspnet/core/blazor/compo...


А вообще, вроде это делается чем-то типа переключалок, типа табов

https://getbootstrap.com/docs/5.0/components/navs-tabs/#ja...


Или вообще меню с "шагами", где в зависимости от выбранных опций на текущем шаге вы выбираете форму меню следующего шага. Т.е. вместо того, чтобы создавать динамически, вы создаёте дерево заранее созданных вариантов меню.

https://www.telerik.com/blazor-ui/stepper

https://blazor.radzen.com/steps


По-моему, эти шаги то же самое, как если бы вы везде навтыкали @if, только тут вы будете их втыкать на каждом шаге и анализировать выбор пользователя на предыдущем шаге. Типа


// step 3
<Step>
    @if (userSelectStep1 and userSelectStep2)
        <div>...
    @else if (...)
        <div>...
    @else
        <div>...
</Step>


#21 
AlexNek патриот13.05.23 19:38
AlexNek
NEW 13.05.23 19:38 
in Antwort alex445 13.05.23 16:35, Zuletzt geändert 13.05.23 19:43 (AlexNek)
Что-то типа такого?

нет хотя может идея и такая. Если сильно хочется понять - есть некое описание формы, оно задается странице по открытию и вот получаем форму по описанию.

Есть набор фиксированных компонент, а из них уже собирается то, что нужно пользователю.

Кроме того, есть описание того как ведет себя компонент по мере ввода данных. Типа, в зависимости от возраста могут разрешить вводить данные в поле класс/школа, а могут и запретить.


А вообще, вроде это делается

А что мы собрались обсуждать как это лучше сделать? Пока подобная задача не стоит.

Да и вначале нужно знать, что же действительно нужно пользователю? А после уже думать как это лучше реализовать

#22 
alex445 коренной житель13.05.23 20:45
NEW 13.05.23 20:45 
in Antwort AlexNek 13.05.23 19:38, Zuletzt geändert 13.05.23 20:46 (alex445)
Кроме того, есть описание того как ведет себя компонент по мере ввода данных. Типа, в зависимости от возраста могут разрешить вводить данные в поле класс/школа, а могут и запретить.

Это же триггерами делается или что там в Блейзоре, просто обработчик события changed, чтоли - enabled-disabled одного контрола зависит от данных другого.


есть некое описание формы, оно задается странице по открытию

Ну тогда просто пачка if-ов на рендер компонентов, которые зависят от описания.

#23 
AlexNek патриот13.05.23 22:23
AlexNek
NEW 13.05.23 22:23 
in Antwort alex445 13.05.23 20:45, Zuletzt geändert 13.05.23 22:25 (AlexNek)
Ну тогда просто пачка if-ов

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


Поразмышляете лучше, что мы увидим в логах от приведенных фрагментов кода

https://foren.germany.ru/showmessage.pl?Number=40152904&Bo...

#24 
Murr патриот14.05.23 00:45
Murr
NEW 14.05.23 00:45 
in Antwort alex445 13.05.23 20:45
Ну тогда просто пачка if-ов на рендер компонентов

------

А виртуальную функу в компонент втиснуть не судьба?

Ну тогда посмотри на набор конструкторов...

#25 
AlexNek патриот15.05.23 20:01
AlexNek
NEW 15.05.23 20:01 
in Antwort AlexNek 13.05.23 13:43

Никогда не поверите, по нажатию кнопки с функцией которая ничего не делает происходит офигенное количество действий. В том числе происходит вызов функции ParametersSetAsync.

По названию которой можно сделать предположение что параметры изменились.

---Pressed button Refresh---
ShouldRender Owner
set:[Forecasts, BlazorTestCascadingValue.Data.WeatherForecast[]]
OnParametersSetAsync enter
ShouldRender child
OnAfterRenderAsync Owner: enter
OnAfterRenderAsync child:enter
OnAfterRenderAsync Owner: next render
OnAfterRenderAsync child: next render
ShouldRender Owner
set:[Forecasts, BlazorTestCascadingValue.Data.WeatherForecast[]]
OnParametersSetAsync enter
ShouldRender child
OnAfterRenderAsync Owner: enter
OnAfterRenderAsync child:enter
OnAfterRenderAsync child: next render
OnAfterRenderAsync Owner: next render
OnParametersSetAsync exit
ShouldRender child
OnAfterRenderAsync child:enter
OnAfterRenderAsync child: next render
OnParametersSetAsync exit
ShouldRender child
OnAfterRenderAsync child:enter
OnAfterRenderAsync child: next render</code>
#26 
alex445 коренной житель16.05.23 00:38
NEW 16.05.23 00:38 
in Antwort AlexNek 15.05.23 20:01, Zuletzt geändert 16.05.23 00:40 (alex445)

С какой стати? Может, там проверка на изменение и выход без действий, если параметры не изменились? Типа как сеттер в свойстве с проверкой параметра на равенство текущему значению поля.


А вообще, чего удивительного, что там куча всего вызывается? Он же определяет в каждом компоненте дерева, надо ли его перерисовать или выполнить какое-нибудь действие, назначенное пользователем. При этом там может быть банальная проверка установленного на действие делегата на null, и если null, то ничего не делать - аналогично с сеттерами. Это ещё системные вызовы не показываются, а лишь то, что Блейзору принадлежит.

#27 
AlexNek патриот16.05.23 20:26
AlexNek
NEW 16.05.23 20:26 
in Antwort alex445 16.05.23 00:38
С какой стати?

Всё оказывается описано в доку. Нужно только найти нужную часть и правильно интерпретировать

https://learn.microsoft.com/en-us/aspnet/core/blazor/compo...

https://learn.microsoft.com/en-us/aspnet/core/blazor/compo...

https://learn.microsoft.com/en-us/dotnet/api/microsoft.asp...


#28 
1 2 alle