Лучшая практика для вставки и запроса данных из памяти

StackOverflow https://stackoverflow.com/questions/3178628

  •  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).

Данные истории в памяти оказывают риск потерять данные в случае сбоев или сбоев питания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top