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

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

1748  1 2 3 4 все
AlexNek патриот27.04.23 21:57
AlexNek
27.04.23 21:57 

GUID как PK, база Postgresql, для Oracle тоже интересно. В связке с EF.

Что скажете?

MS в своих примерах любит строки. Но что то многим это не нравится.

#1 
alex445 коренной житель27.04.23 23:05
NEW 27.04.23 23:05 
в ответ AlexNek 27.04.23 21:57

Как дефолтно хранится, так и храню. Даже вопросом не задавался, как оно там. Там большие дяди сверху есть с большими зарплатами, вот пусть за меня и думают. А как начну семь знаков за работу получать, так тоже думать об этом начну. Как-то так. )))

#2 
AlexNek патриот27.04.23 23:09
AlexNek
NEW 27.04.23 23:09 
в ответ alex445 27.04.23 23:05
Как дефолтно хранится, так и храню

А какой именно тип в базе? База ПГ?


А как начну семь знаков за работу получать, так тоже думать об этом начну

Что то мне кажется тогда уже будет поздно смущ

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

#3 
alex445 коренной житель28.04.23 00:47
NEW 28.04.23 00:47 
в ответ AlexNek 27.04.23 23:09, Последний раз изменено 28.04.23 00:48 (alex445)
А какой именно тип в базе? База ПГ?

Не знаю, что за "ПГ", но тип вроде такой и есть - GUID.


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

Да ладно? ))


Что то мне кажется тогда уже будет поздно

Утром деньги, вечером стулья. Вечером деньги, утром стулья. Но деньги вперёд!

#4 
MrSanders коренной житель28.04.23 14:40
NEW 28.04.23 14:40 
в ответ AlexNek 27.04.23 21:57
GUID как PK, база Postgresql, для Oracle тоже интересно. В связке с EF.

Мнэ... Let me google it for you, понимаешь. https://www.postgresql.org/docs/current/datatype-uuid.html Вот только про связку с EF ничего сказать не могу.

#5 
Murr патриот28.04.23 15:29
Murr
NEW 28.04.23 15:29 
в ответ AlexNek 27.04.23 21:57

Что скажете?

------

А зачем?

В смысле - там изначально не дается гарантии на уникальность...


Если не хватает размера ключа - вешай триггер на вставку и делай хоть 256+ байт ключ...

Ну или выполняй компрессию базы - через Аксесс делалось на раз...

#6 
AlexNek патриот28.04.23 21:03
AlexNek
NEW 28.04.23 21:03 
в ответ MrSanders 28.04.23 14:40
Let me google it for you

но там нет сравнения различных способов смущ

Это первое, что интересовало.

Второе, что делает EF по умолчанию. Это я уже знаю - оракле: raw, постгрес: uuid

И третье, как как сделать преобразование базы оракле в постгресс с наименьшими затратами если "там есть" Guid.

Не забыть и про изменения в софте. Желательно никаких.

#7 
AlexNek патриот28.04.23 21:07
AlexNek
NEW 28.04.23 21:07 
в ответ Murr 28.04.23 15:29, Последний раз изменено 28.04.23 21:18 (AlexNek)
там изначально не дается гарантии на уникальность

"the chances of generating a duplicate GUID : 1 in 2^128;"

пока хватает, да и так уже сделано.


Если не хватает размера ключа

дело разве в этом было, что так сделали или делают?

#8 
Murr патриот28.04.23 23:52
Murr
NEW 28.04.23 23:52 
в ответ AlexNek 28.04.23 21:07

дело разве в этом было

-----

Так никакого другого резона, кроме непомерной глупости, в использовании ГУИД в качестве ПК Я не знаю...


chances

------

Ну тут или шансы, или гарантии...

Повторюсь - для ГУИДов нет гарантии не повторения...

#9 
MrSanders коренной житель29.04.23 00:06
NEW 29.04.23 00:06 
в ответ AlexNek 28.04.23 21:03
но там нет сравнения различных способов смущ

Это первое, что интересовало.

Так тебе шашечки или ехать?

Определись какие способы сравнивать собираешься.

Надеюсь, достаточно очевидно что на хранение 128-и битного поля бд потратит туро меньше места чем на строку.

#10 
alex445 коренной житель29.04.23 09:03
NEW 29.04.23 09:03 
в ответ AlexNek 28.04.23 21:03, Последний раз изменено 29.04.23 09:04 (alex445)
Не забыть и про изменения в софте. Желательно никаких.

В том же EF и подобных ORM должна быть как минимум перегенерина прослойка доступа к БД. А сами вызовы методов прослойки вроде и не меняются.


И третье, как как сделать преобразование базы оракле в постгресс с наименьшими затратами если "там есть" Guid.

Есть какие-то другие преобразования, кроме копирования данных из таблиц с вызовом newguid, newid (или подобного) для каждой новой строки? Неважно, гуиды это или обычный интегер.

Новая БД - новые идентификаторы. Только остальные данные можно полностью скопировать.

#11 
AlexNek патриот29.04.23 10:58
AlexNek
NEW 29.04.23 10:58 
в ответ Murr 28.04.23 23:52
кроме непомерной глупости

Это не аргументы, всегда есть плюсы и минусы.


для ГУИДов нет гарантии не повторения

А отчего это должно волновать, с подобной вероятностью, в данном конкретном случае?

А даже если и будет получен не уникальный ид, какой катастрофой это будет нам грозить?

#12 
AlexNek патриот29.04.23 11:10
AlexNek
NEW 29.04.23 11:10 
в ответ MrSanders 29.04.23 00:06
Так тебе шашечки или ехать?

Хотелось бы найти критерии выбора для каждого случая.

Пока есть две вроде 2 группы: строки и цифровая форма.


то на хранение 128-и битного поля бд потратит меньше места чем на строку

Скажем так - недостаток 1, и во всех ли случаях нам это будет интересно?

Какие еще есть?


Из достоинств, как кажется:

  • 100% переносимость
  • Минимум конвертаций, если пользуем json
  • Что вижу то и "пою". Блин, сейчас с ораклом просто катастрофа. При отладке видишь одно, в при просмотре базы совсем другое.
#13 
AlexNek патриот29.04.23 11:13
AlexNek
NEW 29.04.23 11:13 
в ответ alex445 29.04.23 09:03
А сами вызовы методов прослойки вроде и не меняются

не меняются. А если народ любит code first?


Новая БД - новые идентификаторы. Только остальные данные можно полностью скопировать.

От подобных заяв волосы дыбом встают шок

#14 
Murr патриот29.04.23 12:19
Murr
NEW 29.04.23 12:19 
в ответ AlexNek 29.04.23 10:58

А отчего это должно волновать

------

Я вот не припомню, чтобы в каком-нибудь софте случалось видеть обработку ошибки уникальности первичного ключа...

Судя по вопросу - ключи генерятся не на сервере, а клиентами - т.е. там вообще бардак гарантируется...


какой катастрофой это будет нам грозить?

-----

А что будет результатом выборки при наличии двух и более одинаковых ПК?

А какая именно будет первой?

#15 
AlexNek патриот29.04.23 14:23
AlexNek
NEW 29.04.23 14:23 
в ответ Murr 29.04.23 12:19

а я вот не припомню, чтобы PK не имел "атрибута" уникальности смущ

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

#16 
Murr патриот29.04.23 14:30
Murr
NEW 29.04.23 14:30 
в ответ AlexNek 29.04.23 14:23

а я вот не припомню

------

https://it.wikireading.ru/20048


Хотя да, исключения могут быть

-----

Именно так...

#17 
alex445 коренной житель29.04.23 16:36
NEW 29.04.23 16:36 
в ответ alex445 29.04.23 09:03
В том же EF и подобных ORM должна быть как минимум перегенерина прослойка доступа к БД. А сами вызовы методов прослойки вроде и не меняются.

Поэтому, кстати, и не нужна эта самописная устаревшая херота типа "repository pattern". Максимум, если там какая-то лютая кастомная транзакция с задействованием кучи сущностей - ну пишешь её в отдельную функцию.

#18 
alex445 коренной житель29.04.23 16:39
NEW 29.04.23 16:39 
в ответ AlexNek 29.04.23 11:13, Последний раз изменено 29.04.23 16:41 (alex445)
А сами вызовы методов прослойки вроде и не меняются
не меняются. А если народ любит code first?

А это тут причём? Коде фёрст это описание модели, а функционал вы берёте от изкоробочного базового класса с поддержкой EF интерфейсов типа IQueryable, если мне не изменяет память.


Новая БД - новые идентификаторы. Только остальные данные можно полностью скопировать.
От подобных заяв волосы дыбом встают шок

Приведите заявы получше. Я не эксперт - я бы тупо скопировал данные из таблиц с новой генерацией ключей. Вы бы ключи тоже скопировали? А там есть возможность выбирать, будут ключи копироваться или генериться? Как механизм БД распознает, как генерить следующие ключи после вставки кучи готовых? Когда БД сама генерит от начала и до конца, то ей норм, а когда всякие вмешиваются в этот процесс в погоне за призрачными оптимизациями, то могут вознинуть сложности.

#19 
AlexNek патриот29.04.23 23:14
AlexNek
NEW 29.04.23 23:14 
в ответ Murr 29.04.23 14:30, Последний раз изменено 29.04.23 23:16 (AlexNek)

На вот попробуй

CREATE TABLE [dbo].[AspNetRoles] ( 
  [Id] NVARCHAR(128) NOT NULL,
  [Name] NVARCHAR(256) NULL,
  [NormalizedName] NVARCHAR(256) NULL,
  [ConcurrencyStamp] NVARCHAR(MAX) NULL,
  CONSTRAINT [PK_AspNetRoles] PRIMARY KEY ([Id])
);
CREATE UNIQUE INDEX [RoleNameIndex] 
ON [dbo].[AspNetRoles] (
  [NormalizedName] ASC
);
INSERT INTO [dbo].[AspNetRoles] ([Id], [Name], [NormalizedName], [ConcurrencyStamp]) VALUES 
    ('27163748-00f8-4725-8d4e-9dce62923f2c', 'TestAdmin', 'TESTADMIN', 'af32e894-1def-4665-b7be-dff048774f1a');
INSERT INTO [dbo].[AspNetRoles] ([Id], [Name], [NormalizedName], [ConcurrencyStamp]) VALUES 
    ('274e474d-a20d-48a6-ab9a-f260a88fec43', 'TestStudents', 'TESTSTUDENTS', 'e8d8fa37-89b5-4f9d-bdc4-476111593ce9');
INSERT INTO [dbo].[AspNetRoles] ([Id], [Name], [NormalizedName], [ConcurrencyStamp]) VALUES 
    ('274e474d-a20d-48a6-ab9a-f260a88fec43','abs','abs','e8d8fa37-89b5-4f9d-bdc4-476111593ce8');

[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Violation of PRIMARY KEY constraint 'PK_AspNetRoles'. Cannot insert duplicate key in object 'dbo.AspNetRoles'. The duplicate key value is (274e474d-a20d-48a6-ab9a-f260a88fec43).

#20 
AlexNek патриот29.04.23 23:25
AlexNek
NEW 29.04.23 23:25 
в ответ alex445 29.04.23 16:39, Последний раз изменено 29.04.23 23:28 (AlexNek)
А это тут причём?

migration каталог желательно исследовать


я бы тупо скопировал данные из таблиц с новой генерацией ключей

Я тоже никак не эксперт в базах, просто есть некоторый опыт, ну вот две таблицы, как будет выглядеть копия?

|PK |     |
| 1 |Test1|
| 2 |Test2|

|PK  |     | | |
| 1  |Test1|1|2|
| 2  |Test2|1|2|
#21 
alex445 коренной житель30.04.23 00:48
NEW 30.04.23 00:48 
в ответ AlexNek 29.04.23 23:25, Последний раз изменено 30.04.23 00:52 (alex445)

Я чёт не понял. Если БД используют разные СУБД и исключительно их эксклюзивные фишки, то да, могут возникнуть проблемы. Но если всё подчиняется общему SQL, то их по идее не должно быть. А уж если вообще всё в одной СУБД происходит, то тем более.


Причём тут ваши таблички при преобразовании баз - непонятно. Ну я просто скопирую схему БД в новой СУБД (в том же MS SQL даже команда вроде есть создать скрипт создания БД по уже имеющейся БД) и начну копировать данные. В зависимости от наличия и количества связей с другими таблицами, это будет иметь разную сложность, но в принципе выполнимо же? А если есть встроенные механизмы миграции БД на другие СУБД - то вообще хорошо.

#22 
alex445 коренной житель30.04.23 00:55
NEW 30.04.23 00:55 
в ответ AlexNek 29.04.23 23:25, Последний раз изменено 30.04.23 00:56 (alex445)
А это тут причём?
migration каталог желательно исследовать

А почему нельзя взять последний слепок схемы БД и использовать его? Зачем вам история изменений с незапамятных времён? EF же может генерить схему классов ORM по уже имеющейся БД. А там можете дальше дописывать изменения вашими миграциями.


Я не эксперт, но попробовав немного пописать миграции в EF пришёл к выводу, что через какое-то время там просто нечитаемая лапша. Нафига её копить - протоколирование всех изменений - непонятно. Просто начинаешь новую жизнь с чистого листа при переносе БД и всё.

#23 
Murr патриот30.04.23 16:21
Murr
NEW 30.04.23 16:21 
в ответ AlexNek 29.04.23 23:14

На вот попробуй

-----

Зачем?

Я и так верю что ты знаешь что у мелкомягких ПК - не нулл и уникален....

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


ODBC Driver 17 for SQL Server

-----

У тебя корректная обработка этого исключения есть?

А если поменять драйвер? Взять не ОДБС, а MS SQL (native)...

#24 
AlexNek патриот30.04.23 20:03
AlexNek
NEW 30.04.23 20:03 
в ответ Murr 30.04.23 16:21
мелкомягких ПК - не нулл и уникален

странно, а отчего sqlite выдает? UNIQUE constraint failed: AspNetRoles.Id

у мелкомягких научились гады? Ломит проверять все базы, но грю, что не помню другого поведения смущ


У тебя корректная обработка этого исключения есть?

Зачем? достаточно того что в базе не будет дубликатов


Взять не ОДБС, а

давай еще попробуем oledb... может там будет разрешено



#25 
Murr патриот30.04.23 22:17
Murr
NEW 30.04.23 22:17 
в ответ AlexNek 30.04.23 20:03

все базы, но грю, что не помню

-----

А твое ВСЕ включает не реляционные?


Зачем?

------

И шо? или ничаво ня потяряетси, или тоби пофиг на потери...



давай еще попробуем

-----

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

и у ОДБС ехсептионы, насколько Я помню, отличаются от мсскл-найтивных...

т.е. - качатся, но только сильно обобщенно...

#26 
AlexNek патриот30.04.23 22:44
AlexNek
NEW 30.04.23 22:44 
в ответ Murr 30.04.23 22:17
А твое ВСЕ включает не реляционные?

Нет конечно это уже совсем другая история.


то, что работает с мелкомягким, не будет работать с ораклом

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


ОДБС ехсептион

И много кто сейчас новые проекты на ентом делает? Или даже пользует?


Ты лучше скажи - с постгрессом опыт есть? А то он гад отчего то не любит async запросы из EF, которые получаются как бы параллельно (один запрос начался, "выходим" и заходим в другой). С ораклом никаких проблем не было.

#27 
AlexNek патриот30.04.23 22:49
AlexNek
NEW 30.04.23 22:49 
в ответ alex445 30.04.23 00:55
EF же может генерить схему классов ORM по уже имеющейся БД

надо было как раз наоборот, софт должен остаться "неизменным". Еде долго еще пришлось искать отчего два контехта одновременно не хотели работать, вместе с одним базовым классом.


#28 
Murr патриот01.05.23 05:24
Murr
NEW 01.05.23 05:24 
в ответ AlexNek 30.04.23 22:44

с постгрессом опыт есть?

------

Одна инсталляция... лет 25 назад... только инсталляция...


не любит async запросы из

------

Не помню. У МС СКЛ есть монопольный режим - там только последовательное выполнение и только одного пользователя.

#29 
MrSanders коренной житель01.05.23 16:40
NEW 01.05.23 16:40 
в ответ AlexNek 30.04.23 22:44
Ты лучше скажи - с постгрессом опыт есть? А то он гад отчего то не любит async запросы из EF, которые получаются как бы параллельно (один запрос начался, "выходим" и заходим в другой). С ораклом никаких проблем не было.

Никаких проблем с potgresql-ем не было. Но не из EF. А в чём проблема-то выраваетя, а то, может, ты незакоммиченные изменения найти не можешь?

#30 
AlexNek патриот01.05.23 18:02
AlexNek
NEW 01.05.23 18:02 
в ответ MrSanders 01.05.23 16:40
А в чём проблема-то

Пока как видится на данный момент, еще нужно дальше исследовать.

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

Один пользователь, всё локально, один контехт базы.

Данные выдаются как IAsyncEnumerable. Одна компонента начинает асинк запрос на чтение базы, потом, по идее идет дальше, переходит в другую и опять начинает асинк запрос на чтение. Вот этот второй запрос и выдает исключение, что мол, типа нефиг вызывать один контекст их двух разных потоков. Но что то непонятно, откуда несколько потоков при отрисовки компоненты, по идее всё в одном ui потоке должно быть. Да и с ораклом то всё работало и работает, с тем же кодом.

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

Лечится либо задержкой между вызовами, либо переделкой на синхронное чтение из базы. Но ни то ни другое, как то не хочется.

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

А с чего бы второму потоку не взяться, если асинхронные операции могут выполняться как в одном потоке, так и в разных?


А вы уверены, что компоненты при отрисовке всё в одном потоке делают, а не каждый свой создаёт? State changed же для каждого компонента (и его подкомпонентов) отдельно выполняется, а значит каждый сам себя перерисовывает.


А в Оракле точно всё асинхронно работало, или там синхронно всё выполняется?

#32 
AlexNek патриот01.05.23 19:52
AlexNek
NEW 01.05.23 19:52 
в ответ alex445 01.05.23 19:30
А вы уверены, что компоненты при отрисовке всё в одном потоке делают

В ошибке даже не про потоки сказано, просто как наиболее вероятная причина. Именно это и хотел проверить.

#33 
Murr патриот01.05.23 20:03
Murr
NEW 01.05.23 20:03 
в ответ AlexNek 01.05.23 18:02

Но что то непонятно, откуда несколько потоков

------

Мне вот непонятно почему ожидается один поток... при асинхронике.


по идее всё в одном ui потоке должно быть.

-----

Хи-хи...

Это ты еще с мелкомягкой многопоточностью в ДотНет не работал...

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

#34 
Murr патриот01.05.23 20:06
Murr
NEW 01.05.23 20:06 
в ответ AlexNek 01.05.23 19:52

В ошибке даже не про потоки

-----

Так может по старинке - пример минимального кода и полную ошибку? спок

#35 
AlexNek патриот01.05.23 20:13
AlexNek
NEW 01.05.23 20:13 
в ответ Murr 01.05.23 20:06
и полную ошибку?

фигвамс - логин испортился, вышел гад уже на битлокер, никакого доступа нет к рабочему лаптю, как и к рабочему веб логину.


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

#36 
AlexNek патриот01.05.23 20:20
AlexNek
NEW 01.05.23 20:20 
в ответ Murr 01.05.23 20:03
не вот непонятно почему ожидается один поток... при асинхронике.

дай описание где написано про много смущ

https://stackoverflow.com/questions/37419572/if-async-awai...

#37 
AlexNek патриот01.05.23 20:23
AlexNek
NEW 01.05.23 20:23 
в ответ alex445 01.05.23 19:30
А в Оракле точно всё асинхронно работало, или там синхронно всё выполняется?

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

С ораклом как работало так и работает, а с пг фиг вам.

#38 
alex445 коренной житель01.05.23 20:28
NEW 01.05.23 20:28 
в ответ Murr 01.05.23 20:03
Там - шикарно... создаешь поток, все нормально... запускаешь, все нормально... получаешь данные, все нормально... пытаешься что-то сделать в созданном потоке - облом... Нее, все работает и управляется, вот только не в том потоке что тобою создан... как? а хрен его знает... чтобы получить что нужно было откатился до примитивного потока - тогда получилось...

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

#39 
Murr патриот01.05.23 21:09
Murr
NEW 01.05.23 21:09 
в ответ AlexNek 01.05.23 20:20

дай описание где написано про много

------

Увы, но нету... есть - на уровне ощущений/пониманий...

#40 
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 
AlexNek патриот03.05.23 19:54
AlexNek
NEW 03.05.23 19:54 
в ответ Murr 03.05.23 12:00
что Студия делает это не явно

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

Но повторить сиё явление, я думаю, у тебя больше получается.

#61 
1 2 3 4 все