Лучшая практика для вставки и запроса данных из памяти
-
02-10-2019 - |
Вопрос
У нас есть приложение, которое занимает данные в реальном времени и вставляет его в базу данных. Это онлайн на 4,5 часа в день. Мы вставляем данные второй к второму в 17 таблицах. Пользователь в любое время может запрашивать любую таблицу для последних второго данных и некоторой записи в истории ...
Обработка подачи и вставки выполнено с помощью приложения консоли C # ...
Обработка пользовательских запросов осуществляется через службу WCF ...
Мы выяснили, что вставка - наше узкое место; большую часть времени взят там. Мы вложили много времени, пытаясь FineTune Tables и indecify, пока результаты не были удовлетворительными
Предполагая, что у нас есть важная память, какова лучшая практика для вставки данных в память вместо имеющей база данных. В настоящее время мы используем DataTables, которые обновляются и вставлены каждую секунду, коллега нашего, предложил другую службу WCF вместо базы данных между обработчиком Feedler и WCF-запроса пользователя. MID-слой WCF должен быть на основе TCP, и он сохраняет данные в своей собственной памяти. Можно сказать, что обработчик подачи может иметь дело с пользовательскими запросами вместо того, чтобы иметь средний слой между 2 процессами, но мы хотим отделять вещей, поэтому, если вылетает обработчик Feedler, мы хотим, чтобы все еще могли предоставить пользователю текущие записи
Мы ограничены вовремя, и мы хотим переместить все в память в короткие сроки. Наличие WCF в середине 2 обрабатывает плохую вещь? Я знаю, что запросы добавляют некоторые накладные расходы, но все эти 3 процесса (Feed-Handler, в базе данных памяти (WCF), пользователь-запрос-обработчик (WCF) будут на одной и той же машине, а пропускной способности не будет так много проблемы.
Пожалуйста помогите!
Решение
Я бы посмотрел на создание кэширования данных (так, что вы также можете уменьшить выбору базы данных), а неверные данные в кэше после того, как он был записан в базу данных. Таким образом, вы можете загрузить звонки, чтобы сделать большую вставку вместо многих небольших, но сохраняйте данные в памяти, так что читатели могут прочитать его. На самом деле, если вы знаете, когда данные становятся устаревшими, вы можете избежать читать базы данных целиком и использовать его просто как сохраняющий хранилище - таким образом, производительность базы данных повлияет на то, насколько большими получает ваш кеш.
Недействительные данные в кэше будут основываться на том, записывается ли его запись в базу данных или ее устойчивости, которая когда-либо приходит прошлой, Не сначала.
Кэш-слой не должен быть сложен, однако он должен быть многопользован для размещения данных, а также сохранить его на заднем плане. Этот слой будет сидеть только за помощью WCF Service, соединительной среды, а служба WCF должна быть улучшена, чтобы содержать логику приложения консоли + идею дозирования. Затем приложение консоли может просто подключиться к WCF и бросать результаты на него.
Обновлять: Единственная вещь, которую можно сказать, - это инвестировать в профилировщик, чтобы посмотреть, представляете ли вы какие-либо проблемы с производительностью в коде, которые замаскируются. Также профиль вашей базы данных. Вы упоминаете, что вам нужны быстрые вставки и вылеты - к сожалению, они обычно компенсируют друг друга ...
Другие советы
Какую базу данных вы используете? MySQL имеет память двигателя хранения, которая, кажется, подходит для этой вещи.
Вы используете datatable с dataadapter? Если это так, я бы порекомендовал вам полностью бросить их. Вставьте свои записи напрямую, используя DBCommand. Когда отчеты запрашивают пользователи, прочитайте данные с использованием DataReader или заполните объекты DataTable, используя DataTable.load (IdatAreader).
Данные истории в памяти оказывают риск потерять данные в случае сбоев или сбоев питания.