Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как лучше хранить GUID в базе (тип данных)?

1748  1 2 3 4 все
Murr патриот01.05.23 21:11
Murr
NEW 01.05.23 21:11 
в ответ alex445 01.05.23 20:28

Это случайно не про обновление UI из рабочего потока?

-----

не-а....

#41 
AlexNek патриот01.05.23 21:19
AlexNek
NEW 01.05.23 21:19 
в ответ Murr 01.05.23 21:09
на уровне ощущений

А хотя бы на уровне логов есть? Ощущения иногда, гады обманывают.

Вот я сейчас одно думаю, а на самом деле может быть совсем другое.

#42 
alex445 коренной житель02.05.23 08:16
NEW 02.05.23 08:16 
в ответ AlexNek 01.05.23 21:19, Последний раз изменено 02.05.23 13:28 (alex445)
Вот я сейчас одно думаю, а на самом деле может быть совсем другое.

И часто с вами такое? ))

#43 
MrSanders коренной житель02.05.23 10:17
NEW 02.05.23 10:17 
в ответ AlexNek 01.05.23 18:02
Данные выдаются как IAsyncEnumerable. Одна компонента начинает асинк запрос на чтение базы, потом, по идее идет дальше, переходит в другую и опять начинает асинк запрос на чтение. Вот этот второй запрос и выдает исключение, что мол, типа нефиг вызывать один контекст их двух разных потоков. Но что то непонятно, откуда несколько потоков при отрисовки компоненты, по идее всё в одном ui потоке должно быть. Да и с ораклом то всё работало и работает, с тем же кодом.

...Осталось еще проверить номера потоков, что бы наверняка знать

Гм. Это какой-то шарпный/EF геморрой. Тут я не помогу. Так-то у постгреса нет никаких проблем с паралелльным доступом. Ну, если кто-то с какого-то перепугу не выставил isolation level в serializable конечно.

P.S. Ну и если мелокомягкие не изобрели какое-то очередное гавно вроде замыканий по ссылке, то конечно же вызванные черезе await-async методы могут выполнятся в разных потоках. Какой-то пул потоков должен быть.

#44 
alex445 коренной житель02.05.23 13:32
NEW 02.05.23 13:32 
в ответ AlexNek 01.05.23 18:02
Лечится либо задержкой между вызовами, либо переделкой на синхронное чтение из базы. Но ни то ни другое, как то не хочется.

Попробуйте ещё виртуализацию на клиенте сделать, чтобы запрашивалась только та часть, что сейчас отображается (с запасом в начале и конце списков). Тогда запросы будут быстрые и данных будет передаваться немного. Может, они и не пересекутся. Обычно в популярных Blazor-фреймворках такая виртуализация из коробки есть.


Зачем тут вообще IAsyncEnumerable не понял. Первый раз эту штуку встречаю. Если запросы маленькие, может, можно и без этого обойтись?

#45 
AlexNek патриот02.05.23 19:28
AlexNek
NEW 02.05.23 19:28 
в ответ Murr 01.05.23 20:06

Тестовый проект очень простой:

Главная компонента, вызывает вложенную компоненту, та еще одну. Код 1й вложенной компоненты, остальное тоже самое практически

Child 1 Component enter await thread @idOfRenderingThreadIn continue thread @idOfRenderingThreadOut

        <Child2Component></Child2Component>

@code {
    private int idOfRenderingThreadIn;
    private int idOfRenderingThreadOut;
    protected override async Task OnInitializedAsync()
    {
        idOfRenderingThreadIn = System.Threading.Thread.CurrentThread.ManagedThreadId;
        await base.OnInitializedAsync();
        await Task.Delay(10);
        idOfRenderingThreadOut = System.Threading.Thread.CurrentThread.ManagedThreadId;
    }
}

Результат выполнения


и нашлось: что только для Blazor server повторный вход в компоненту может быть из другого потока (точнее речь идет об отрисовке)

Ошибка:

error: System.InvalidOperationException: A second operation was started on this context instance before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.

По ссылке ничего полезного не нашлось для данного случая.


То бишь отчего не работает, стало вроде понятно. А вот отчего Оракл работает еще непонятно.

#46 
AlexNek патриот02.05.23 19:30
AlexNek
NEW 02.05.23 19:30 
в ответ alex445 02.05.23 08:16
И часто с вами такое?

Не считал, а отчего подобный интерес?

#47 
AlexNek патриот02.05.23 19:33
AlexNek
NEW 02.05.23 19:33 
в ответ MrSanders 02.05.23 10:17
Так-то у постгреса нет никаких проблем с параллельным доступом

И из разных потоков?


Хотя много где сказано, что DBContext от EF не thread safe. хммм

#48 
AlexNek патриот02.05.23 19:39
AlexNek
NEW 02.05.23 19:39 
в ответ alex445 02.05.23 13:32
Попробуйте ещё виртуализацию на клиенте сделать

не поможет, и не нужно. Относительно мало данных


Если запросы маленькие, может, можно и без этого обойтись?

отрисовка все замедляется, а при первом запросе в день будет совсем плохо.


IAsyncEnumerable

Тоже не любитель но иногда полезно

https://dotnetcoretutorials.com/iasyncenumerable-in-c-8/

#49 
AlexNek патриот02.05.23 20:02
AlexNek
NEW 02.05.23 20:02 
в ответ AlexNek 02.05.23 19:28

Сделал операции чтения только из одного потока, всё равно не нравится: A second operation was started on this context instance before a previous operation completed

#50 
alex445 коренной житель02.05.23 20:50
NEW 02.05.23 20:50 
в ответ AlexNek 02.05.23 20:02

Первые же ответы Гугла предлагают юзать отдельный контекст на запрос.

#51 
AlexNek патриот02.05.23 20:52
AlexNek
NEW 02.05.23 20:52 
в ответ AlexNek 02.05.23 20:02

лечится только созданием/уничтожением контекста прямо в запросе.

public class FooByIdDataLoader 
{
    private readonly IDbContextFactory _dbContextFactory;

    public FooByIdDataLoader(IDbContextFactory dbContextFactory)
    {
        _dbContextFactory = dbContextFactory;
    }

    protected override async Task>
        LoadBatchAsync(IReadOnlyList keys, CancellationToken ct)
    {
        await using ApplicationDbContext dbContext =
            _dbContextFactory.CreateDbContext();

        return await dbContext.Foos
            .Where(s => keys.Contains(s.Id))
            .ToDictionaryAsync(t => t.Id, ct);
    }
}
#52 
Murr патриот02.05.23 21:23
Murr
NEW 02.05.23 21:23 
в ответ AlexNek 02.05.23 20:52

лечится только созданием/уничтожением контекста прямо в запросе.

------

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

#53 
AlexNek патриот02.05.23 22:27
AlexNek
NEW 02.05.23 22:27 
в ответ alex445 02.05.23 20:50
предлагают юзать отдельный контекст на запрос.

Во первых, тоже не очень хочется.

Во вторых, решение с ДИ сразу перед глазами было?

#54 
AlexNek патриот02.05.23 22:31
AlexNek
NEW 02.05.23 22:31 
в ответ Murr 02.05.23 21:23
что у тебя происходит два входа в метод

явного точно нет, а при асинке да, зашли/вышли и опять зашли. Но это другой случай, на "паралельном стеке" даже виден вызов другого метода.

#55 
AlexNek патриот02.05.23 22:59
AlexNek
NEW 02.05.23 22:59 
в ответ Murr 02.05.23 21:23, Последний раз изменено 03.05.23 19:31 (AlexNek)

Хорошо что ты сказал, хотел показать другое, что раньше видел, а тут новое.

Слева сидим в exception, а справа фигня, что драйвер еще "секретно" делает видимо, тогда это объясняет отчего с ораклом работает.



#56 
Murr патриот03.05.23 12:00
Murr
NEW 03.05.23 12:00 
в ответ AlexNek 02.05.23 22:31

явного точно нет

-----

Так в том то и проблема, что Студия делает это не явно...

#57 
Murr патриот03.05.23 12:05
Murr
NEW 03.05.23 12:05 
в ответ AlexNek 02.05.23 22:59

Хорошо что ты сказал, хотел показать другое, что раньше видел, а тут новое.

-----

up

Если бы еще понять что это должно значить...


Но!

Методика "свежего глаза" в смеси с "белым шумом" срабатывает регулярно. спок

#58 
alex445 коренной житель03.05.23 14:53
NEW 03.05.23 14:53 
в ответ Murr 03.05.23 12:05
в смеси с "белым шумом"

Что бы вы без меня делали, салабоны. Учитесь, пока я жив!

#59 
AlexNek патриот03.05.23 19:51
AlexNek
NEW 03.05.23 19:51 
в ответ Murr 03.05.23 12:05
Если бы еще понять что это должно значить...

Черт, забыл что картинку только из файла можно вставить, исправил. Слева там, где exception при чтении с базы, справа, что в "паралельном" стеке.


срабатывает регулярно

Увы, радость была напрасной. Всё исключительно что приведено исключительно в тестовом приложении сейчас получается, на деле как и раньше было, два async запроса по чтению.

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

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

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

Похоже мелкими изменениями не обойтись хммм

#60 
1 2 3 4 все