|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
|
Архитектура построения БД linq2db06.01.2021, 08:43. Показов 25705. Ответов 111
Добрый день!
У меня вот такая задача. Нужно создать БД CodeFirst на linq2db. (99% что это linq2db). Эту базу будет использовать более 10 мелких приложений. Как сделать правильно, чтобы методы выборки, создания таблици и т.д. были не конкретно в каждом приложении, а вынесены в стороннюю библиотеку? Чтобы при изменении таблицы или выборки, не приходилось менять это во всех 10 приложениях, а только в одном месте. Очень бы хотелось увидеть реальный пример использования. Где посмотреть уже готовые решения на основе linq2db? Не пример использования запросов из справки linq2db, а именно реальную архитектуру построения модели и контроллера. Буду очень благодарен за любую помощь!
0
|
|
| 06.01.2021, 08:43 | |
|
Ответы с готовыми решениями:
111
В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников Как ускорить запрос Linq2db? |
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||||||||||||
| 15.02.2021, 14:26 [ТС] | ||||||||||||
|
Перешёл на int в mysql + enum в C#. Минусы есть, но плюсов больше конечно. И проще получается с созданием и изменением таблиц. Спасибо. А сейчас столкнулся с проблемой блокировки таблиц. Если блокировать через sql запросы в программе, то всё ок.
Встроенных локов в linq2db не нашёл, (только транзакции) делаю вот так:
Транзакции как мне кажется здесь не подходят.
0
|
||||||||||||
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
|
| 15.02.2021, 15:36 | |
|
BeginnerCoderCS, распишите подробнее идею с блокировками. С вероятностью в 90% вы свою хотелку неверно реализуете.
0
|
|
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||||||||||||
| 15.02.2021, 16:11 [ТС] | ||||||||||||
|
Они периодически меняются. То есть допустим раз в 60 минут нужно проверять нет ли чего-то нового на сервере, и если есть, то сохранять изменения в БД. Так как эти данные используются несколькими приложениями, то каждое из этих приложений должно иметь возможность запросить данные, и обновить их, если нужно. Так вот. Я создал отдельную таблицу, в которой будет храниться последнее изменение других таблиц.
Я проверяю последнее изменение таблицы `City` в таблице `changes`. Данные в таблице `changes` вида (TableName, Status, TimeStamp) ("City", "OK", "2021-02-15 15:50") То есть я проверю когда последний раз получались данные с сервера, и если прошло больше чем 60 минут, то устанавливаю статус "BUSY" ("City", "BUSY", "2021-02-15 15:50") и запрашиваю новые данные. Вот нужно чтобы в этот момент никакое другое приложение не получило эту строку, и не начало так же параллельно получать данные с сервера. Если сделать транзакцию, то второе приложение сможет работать с этой таблицей `changes`, и успеет получить значение которое ещё было "OK". Поэтому
0
|
||||||||||||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 15.02.2021, 16:11 | |
|
Usaga,
.. очень похоже на архитектуру "Пока Машенька из логистики списывает товар (и отлучилась попить кофе), Вася из маркетинга не сможет даже увидеть этот товар, не то что продать..." ...
0
|
|
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||
| 15.02.2021, 16:17 [ТС] | ||
|
Это всё работает на SQL.
А с через linq2db не хочет работать. Добавлено через 4 минуты Это блокируется на время пока устанавливается статус "BUSY", чтобы все последующие не успели взять строку со статусом "ОК" и не ломонулись следом стучаться к удалённому апи за обновлениями, которые к этому времени уже будут получены другим приложением. Есть другие идеи?
0
|
||
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
||
| 15.02.2021, 17:03 | ||
|
На уровне СУБД блокировки, тем более длительные, приведут к существенным проблемам производительности. Блокировки уровня СУБД должны использоватья для решения конкурентного доступа разных транзакций, а не для того, что вы загадали. Так не делают.
0
|
||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||
| 15.02.2021, 17:29 [ТС] | ||
|
То есть каждое приложение не может постоянно долбиться туда. А приложение не одно, и нужно сделать, чтобы раз в 60 минут любое из запущенных приложений могло получить новый курс. OK, можно конечно сделать блокировку на уровне приложения. Но если приложения будут находиться на разных серверах/компьютерах? Это же mysql и она не локальная. Вы вообще не используете блокировку таблиц на linq2db?
0
|
||
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
|||
| 15.02.2021, 17:32 | |||
|
0
|
|||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||
| 15.02.2021, 18:02 [ТС] | ||
|
Отдельное приложение под обновления это уж слишком как по мне. Без блокировки. Первое приложение запустилось и проверяет актуальность курса валют. Последнее изменение 61 минута и статус "OK". Чтобы все остальные приложения не пошли запрашивать данные с апи, в таблице указывается статус "BUSY". НО. Пока проверялась необходимость запроса новых курсов валют и устанавливался статус "BUSY" первым приложением, вполне вероятно, что второе приложение так же запросило актуальность данных, и уже получило себе статус "OK" и 61 минута. И так же отправляет статус "BUSY" и параллельно с первым идёт запрашивать данные с api. После получения с апи и обновления данных в БД, устанавливаем статус "ОК" и новое время обновления. Второе приложение получает ограничение апи запросов, ждёт снятия ограничения, и запрашивает ещё раз, или падает, выключается и т.д. Ещё может быть такое: приложение упало, отключили электричество и т.д., и приложение не установило статус "OK" и там на всё время останется статус "BUSY" и данные никогда не будут обновляться. Значит при запросе нужно получать данные, и проверять как давно установлен статус "BUSY". То есть нужно проверить ещё одно условие. Допустим на обновление данных нужно 5 минут, значит если статус "BUSY" и изменения больше чем 10 минут, то нужно обновить время, и получить новые данные. И это всё с удалённой БД и приложениями на разных компьютерах. Не используя блокировку таблицы не могу придумать как это можно реализовать.
0
|
||
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
||
| 16.02.2021, 09:30 | ||
|
А у вас, я так понял, все клиенты напрямую к базе ломятся, да?)
2
|
||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
|
| 16.02.2021, 10:01 [ТС] | |
|
0
|
|
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
||
| 16.02.2021, 10:04 | ||
|
1
|
||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||||||||||||||||||||||
| 18.03.2021, 18:25 [ТС] | ||||||||||||||||||||||
|
Не создаю новую ветку, думаю этот вопрос будет актуален здесь.
Столкнулся с проблемой, когда из-за длительного ожидания MySQL разрывает соединение. Допустим вот так создаётся коннекшн
Но выполнять код в using(var db..) не всегда есть возможность. Конкретно с linq2db как гарантированно закрыть соединение, очистить ресурсы, освободить пул соединений? Методы Close() и Dispose() достаточно?
Что если это всё реализовать в классе подключения? И вызывать просто db.DisConnect();
0
|
||||||||||||||||||||||
|
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
|
||
| 18.03.2021, 18:38 | ||
|
0
|
||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||
| 18.03.2021, 18:43 [ТС] | ||
|
Уже поздно выкидывать, да и нравится мне эта орм ![]() p.s. А как нормальные люди поступают при изменении объекта (таблицы)? Переписываете все sql запросы?
0
|
||
|
14731 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,857
|
||||||||||
| 19.03.2021, 05:46 | ||||||||||
|
Вообще, как в реальных проектах делается? Подключение к базе создаётся только на время, когда оно реально нужно. Когда оно перестаёт быть нужным (даже временно), оно закрывается. Я не знаю, что за приложение у вас. Вы можете полагаться как на DI и получать в свои сервисы инжектированный экземпляр DbContext, который задиспозится при выходе из области видимости (окончание запроса в веб-приложении, закрытии последнего окна в настольном или остановка сервиса, если у вас служба). Если DI не используется и контекст вы руками создаёте (а так и есть, судя по всему), то можете создавать и диспозить (using) контексты по мере надобности. Ну или, если у вас всё в один поток работает, создать один контекст и держать его до победного, ибо у Linq2Db нет никаких кешей контекста, которые бы забивались мусором во время работы. Единственный ОЧЕНЬ важный момент: в конструкторе контекста обязательно нужно указать, что не нужно удерживать открытым подключение.
Добавлено через 37 секунд Добавлено через 9 минут
2
|
||||||||||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
||||
| 19.03.2021, 08:44 [ТС] | ||||
|
Но при длительном неиспользовании MySQL со своей стороны закрывает соединение. Я попробовал на короткой дистанции, но не пойму как оно работает, поэтому и спрашиваю. Если использовать БД SQLite то вот этот код (this as IDataContext).CloseAfterUse = true; я так понимаю использовать не нужно, так как sqlite не отключает ничего? Наверное не правильно, но очень удобно, создать подключение к бд в начале выполнения, проверить корректность, и уже потом дёргать когда нужно, без нагромождений using и т.д. p.s. Создание объекта через наследование DataConnection указано в wiki. Нужно использовать IDataContext?
0
|
||||
|
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
|
||
| 19.03.2021, 09:01 | ||
|
BeginnerCoderCS, почитайте книги что-ли по ADO.NET. У IDbConnection следующая философия - открывать подключение как можно позже, и закрывать как можно раньше. То же самое, очевидно, касается любых надстроек сверху, включая Linq2Db. Добавлено через 2 минуты Вы с утра, перед тем как идти на работу/учебу, чистите зубы, умываетесь и оставляете кран открытым? А после приходите, закрываете. Я верно понял?
3
|
||
|
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
|
|||
| 19.03.2021, 09:14 [ТС] | |||
Но я бы не стал сравнивать это с реальной жизнью. Хотя с компьютером в принципе так и есть. Выключается крайне редко )) После создания подключения первый запрос длится до 1.5 секунд (как я замечал), но все последующие работают намного быстрее. Вот и получается что 10 запросов отдельными подключениями будут 15 секунд или если одним подключением, то грубо 4 секунды.
0
|
|||
|
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
|
||
| 19.03.2021, 09:20 | ||
|
А для всех последующих был придуман пул подключений. Надеюсь я вправил вам слегка представление о вещах этой аналогией. ![]() Все как в жизни, индустрия разработки уже давно придумала best practices на многие однозначные проблемы, все что вам нужно - следовать им и все.
1
|
||
| 19.03.2021, 09:20 | |
|
Linq2db как изменить имя таблицы? Запрос linq2db c условием разницы времени
Как сохранить изменения сделанные в DataGridView в БД при использовании linq2db?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|