11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||||||||||||
1 | ||||||||||||||||
MS SQL Грамотно добавлять, удалять, обновлять при foreach31.07.2018, 11:43. Показов 5003. Ответов 44
Добрый день.
Приложение раз в две минуты синхронизирует данные с сервера. Если есть изменения, получает коллекции с итемами по типу изменения updatedItems, createdItems и deleteditems. Затем прохожусь по каждой коллекции и внутри цикла в зависимости от типа ChangeType добавляю: Кликните здесь для просмотра всего текста
обновляю: Кликните здесь для просмотра всего текста
и удаляю: Кликните здесь для просмотра всего текста
Грубо говоря, при создании foreach загоняет все в лист и 1 раз InsertAllOnSubmit(). При удалении каждый раз внутри foreach sql-запрос на удаление по id (т.е. если 10 или 20 удаленных записей, то будет 10 или 20 запросов). При обновлении каждый раз внутри foreach получаю элемент, обновляю все значения и SubmitChanges(), при этом на сколько я понял linq кэширует, сверяет запись и затем обновляет, т.е. вон сколько всего. Вопрос: как сделать грамотно? Или и так сойдет?)
0
|
31.07.2018, 11:43 | |
Ответы с готовыми решениями:
44
Как добавлять и удалять записи из БД и будет ли это приложение (будильник) работать на других ПК Как в datagrid добавлять и удалять колонки Как удалять и добавлять вертексы в шейдер? Как добавлять и удалять элементы из очереди? |
5 / 5 / 1
Регистрация: 29.06.2018
Сообщений: 24
|
|
31.07.2018, 14:34 | 2 |
Грамотно , это считывать ресурсы непосредственно при работе с ними .
То есть загрузка данных не должна происходить пару раз , допустим при загрузке данных и соответственно при нажатии на кнопочку Refresh/Update . Начинается работа с данными , перед этим загружайте их . Тут и отпадет надобность автономной синхронизации , и отказоустойчивость повысится . Но если прям надо автономно , то лучше будет ловить сами изменения со стороны сервера, и только тогда обновляться на стороне юзера . Реализации давно лежат на просторах интернета .
0
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
31.07.2018, 15:11 | 3 |
задай себе простой вопрос - что начнется, когда приложение запустят так 100500 раз практически одновременно?
0
|
11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||
31.07.2018, 15:26 [ТС] | 4 | |||||
NeSpe******t, немного не допетриваю в силу неграмотности.
Получаю только вновь созданные, удаленные или измененные. Дальше прогоняю через foreach и идет разбивка. На три цикла разбил для примера. На деле что-то типа: Кликните здесь для просмотра всего текста
Автономная синохроиназция потому что я не могу читать бд из первоисточника, приходится синхронизировать и сливать к себе, например, раз в 2 минуты на бесконечном цикле. Соответственно никакой кнопки нет. Позже вероятно перейдем на свою бд. Поэтому сейчас эта костылина работает, но вот допустим 20 новых изменений (30, 40) и foreach будет раскидывать по типу, и, если удаление или обновление, 20 (30,40) запросов. Хотя бы как загуглить? Добавлено через 8 минут pincet, как я уже написал, эта приблуда в единственно-запущенном экземпляре у меня сливает в фоне итемы с источника ко мне в бд. Вопрос в том, если новых итемов 100500 (что почти никогда не произойдет), то будет 10500 sql комманд на удаление или обновление по id. Круче, чем "синхронизация" и получать только новые итемы, не нашел.
0
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
31.07.2018, 15:32 | 5 |
на самом деле держать данные актуальными в распределенных системах - очень и очень непростая задача
Добавлено через 2 минуты вот твое самое главное заблуждение. где гарантия, что во время твоей "синхронизации" никто не высрет новых записей и не удалит существующих? Добавлено через 1 минуту другое дело, что источник данных тоже контролируется тобой (некоей API) Добавлено через 1 минуту ответ неверный. все нужно на API (DAL) возлагать, а уж там писать грамотные запросы без 100500 скриптов
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
31.07.2018, 17:28 | 6 |
spektr_011, это две базы синхронизируются? Синхронизация в одну сторону? Схемы совпадают? Может применить репликацию, если возможно?
Тут точно нужен EF? Голым SQL-ем было бы поэффективнее. Те же удаления можно в одну ходку выполнить, через DELETE FROM ... WHERE Id IN (Id1, Id2, Id3...) .
0
|
11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|
31.07.2018, 17:40 [ТС] | 7 |
источник заполняется пользователями. по-моему ничего страшного не произойдет. пишется некая кэш строка и с ней сверяется. изменения подтянутся либо в этом, либо в следующем выполнии цикла.
это я в общем то и спрашивал с начала. как?) нет. тяну данные из exchange с помощью ews managed api к себе в таблицу. сейчас это в одну сторону. вот что-то типа этого для удаления и обновления. чтобы скопом. или как организовать DAL в консольной api.
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
31.07.2018, 17:43 | 8 |
Удалить можно одним скопом, я показал как. А обновление и добавление за раз не получится, но можно сформировать длинные запросы (на чистом SQL), с группами инструкций вставки и обновления. Т.е. обращение будет одно, просто запросище будет длинный.
Ну и размеры таких запросов ну надо делать сильно большими, это тоже негативно скажется на производительности.
0
|
11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
||||||
31.07.2018, 17:45 [ТС] | 9 | |||||
добавление вроде вышло.
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
31.07.2018, 17:55 | 10 |
Да, точно, есть же
InsertAllOnSubmit . Обновление оформите иначе. Или создайте один контекст вне цикла, а внутри только выгружайте сущности обновляйте им свойства, а после цикла уже вызывайте сохранение. Но тут кеш контекста уже скажется на производительности. Я хз как с ним работать в LinqToSQL (технология уже заброшенная, я ей не пользуюсь). Или вручную запрос состряпайте, там кеша никакого не будет.
0
|
11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|
31.07.2018, 18:10 [ТС] | 11 |
за этим и пишу - как правильно сделать. наколхозить с кэшем и сам горазд). Хоть большой нагрузки и не будет, но надо же нормально.
0
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
31.07.2018, 20:53 | 13 |
Я так понял нужно на коленках репликацию устроить руками. Абстрагируясь от сервера данных и его возможностей, в лоб, так сказать, надёжнее всего получать все данные из исходника (помечая каждую запись неким timestamp) вливать в базу и при успешном завершении удалять все старые (со старым timestamp, коий текущий хранится для каждой таблицы в служебной). Видел такие решения, работают. Синхронизация запускается по расписанию, когда есть минимальные нагрузки, если это возможно. Если нет - тогда уж решение сильно усложняется, ибо распределённая работа
Добавлено через 8 минут Всяко-разно лучше не перечислять , а явный набор данных указать (subquery)
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
01.08.2018, 06:35 | 14 |
Если данных немного и производительность не страдает, то можно и так оставить. Только я бы выкинул LinqToSQL и использовал другую ORM. И удаление запросом бы тоже убрал и возложил на плечи ORM, иначе криво выходит: в одном месте через ORM, в другом - вручную.
Если будут проблемы с производительностью (долгий процесс импорта), то уже рассмотрел бы ручные запросы на обновление и удаление. Вносил бы данные пачками (записей по пятьдесят-сто), одной ходкой. Речь в этой теме именно о batch-запросах. Т.е. внесении изменений в базу целыми пачками. Если таких пачек немного, то и EF отлично справится (ТС использует LinqToSQL, а не EF!). Если нужно будет оптимизировать, то лучше голый SQL-запрос. Какой набор данных, когда у нас на руках пачка ID?
1
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
01.08.2018, 11:27 | 15 |
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
01.08.2018, 11:35 | 16 |
pincet, из другого сервиса (не из этой же базы). Так что подзапрос не к месту (нечего подзапрашивать).
0
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
01.08.2018, 13:35 | 17 |
Usaga, такой IN сервер развернет в OR и будут печали
0
|
12083 / 8391 / 1283
Регистрация: 21.01.2016
Сообщений: 31,617
|
|
01.08.2018, 13:37 | 18 |
pincet, значит последовательность команд DELETE в один запрос утрамбовать.
0
|
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
|
|
01.08.2018, 13:41 | 19 |
коль скоро в сабже прозвучало про MS SQL, может select @@version стоит озвучить?
0
|
11 / 1 / 1
Регистрация: 28.11.2013
Сообщений: 56
|
|
01.08.2018, 14:31 [ТС] | 20 |
это можно: Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
0
|
01.08.2018, 14:31 | |
01.08.2018, 14:31 | |
Помогаю со студенческими работами здесь
20
Возможность добавлять и удалять поля в модуле Объясните как удалять, добавлять и сортировать строки Как правильнее добавлять и удалять заголовки сообщений? Как динамически добавлять/удалять страницы ViewPager Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |