Как ограничить консольное приложение не блокировать базу данных?

Добрый день.
Есть ASP.Net приложение, которое быстро и стабильно работает.
А есть консольное приложение, которое запускается планировщиком и загружает данные в ту же базу данных, с которой работает ASP.Net приложение. В момент загрузки, особенно если данных много, сайт ASP.Net падает по таймауту. И пока консольное приложение не загрузит все данные сайт лежит.
В момент загрузки нагрузка на сервер 100%. Есть возможность как-то ограничить это консольное приложение, что бы и в базу данные загрузились и сайт не падал.
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 4
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Какой ORM используете?

Тут возможно несколько подходов.
1. Добавить кэши в приложение, что бы оно отдавало старые значения, а запросы раотали в фоне
2. Оттюнить запрос вставки. Возможно поможет пакетная вставка данных.
Ответ написан
@John_Nash
coder
Понизить приоритет процесса (это в случае, если таймауты возникают из-за нехватки процессорного времени)
Ответ написан
2ord
@2ord
Вместо SELECT + UPDATE использовать Upsert с учетом https://michaeljswart.com/2017/07/sql-server-upser...

По сути что оно делает. Берет XML файл. Собирает из него массив того что надо загрузить в базу.
И по каждому элементу массива смотрит, если в базе есть (ещет по коду), то обновляет свойства, если нет, добавляет новый элемент.
А если речь о прейскуранте, когда данные прейскуранта обычно заменяются старые на новые целиком, тогда имеет смысл создать новую таблицу с одного XML, а старую удалить. Тогда таблица текущего прейскуранта не будет запираться на обновление.

Если импорт из XML настолько ресурсоемкая операция, что влияет на продакшн, то можно понизить приоритет процесса импорта. Или же выполнять с другого сервера.
Ответ написан
Комментировать
@basrach
Квантировать. Также как и делает операционная система с процессами. Процессов много, а центральный процессор один. ОС просто даёт маленький интервал времени каждому процессу, все выполняются по очереди и все счастливы.
Самый простой способ - разбить весь массив на пачки по 100 (10, 1000), между обработкой пачки делать тупо Thread.Sleep(300 или меньше), давая тем самым обработать запросы серверу. Параметры подобрать экспериментально.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы