Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
.NET 3.x

Грязное копирование данных

30.09.2015, 08:59. Показов 3012. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некое хранилище данных в произвольной форме (лист, таблица, словарь, массив и т.д. - можно выбрать любой вариант). Хост-приложение с этим хранилищем беспрерывно работает(изменяет). Множество клиентов могут подключатся и запрашивать эти данные.
Проблема в том, что при рассылке данных объект-хранилище захватывается на некоторое время и с ростом числа клиентов, одновременно требующих эти данные, время отклика сильно возрастает(что логично) вплоть до полной блокировки логики программы.
Вопрос: можно ли сделать что-то вроде "грязного" чтения таблицы в SQL? Т.е. получить данные не блокируя к ним доступ для основного приложения? Или любые другие варианты для решения проблемы. Какая-нибудь общая область памяти?..
ВАЖНО: нет 3.5.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2015, 08:59
Ответы с готовыми решениями:

Оффтоп из темы "Грязное копирование данных"
Оригинальная тема: https://www.cyberforum.ru/csharp-net/thread1541178.html Мой вам совет - уберите оттуда .NET и вообще винду...

Копирование данных из интернета
Собственно есть какой-то файл в интернете, к примеру находящийся по ссылке : http://img.yandex.net/i/www/skins/curly/logo2.png. И есть код...

Как запретить копирование данных с диска
Я сделал видео курс и запишу его на диск. Как мне сделать чтоб нельзя было скопировать эти данный на хард диск только просматривать с...

41
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
02.10.2015, 09:04  [ТС]
Студворк — интернет-сервис помощи студентам
Вот весь код. Это худо бедно работает. Убрал всю шелуху.
Кликните здесь для просмотра всего текста

Интерфейс сервиса(тип возвращаемого объекта не принципиален):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace DataService
{
    [ServiceContract]
    public interface IDataSender
    {
        [OperationContract]
        DataTable GetAllData();
 
        [OperationContract]
        DataTable GetSomeData(string request);
 
    }
}
Реализация:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace DataHost
{
    class DataSenderInterface: IDataSender
    {
        public DataTable GetAllData()
        {
            //некоторая логика()
            return SomeDataTable;
        }
 
        public DataTable GetSomeData(string request)
        {
        //некоторая логика()
    return SomeDataTable;
 }
    }
}
Запуск хоста:
C#
1
2
3
4
Type serviceType = typeof(DataSenderInterface);
            Uri serviceUri = new Uri("http://адрес:порт");
            host = new ServiceHost(serviceType, serviceUri);
            host.Open();
Конфиг хоста:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="DataHost.DataSenderInterface" behaviorConfiguration="MyBehavior">
        <endpoint
            address=""
            binding="basicHttpBinding"
            contract="DataService.IDataSender" />
        <endpoint
            address="mex"
            binding="mexHttpBinding"
            contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Клиент:
C#
1
2
3
4
5
6
7
8
const string addr = @"http://адрес:порт/"; 
Uri tcpUri = new Uri(addr);
EndpointAddress address = new EndpointAddress(tcpUri, EndpointIdentity.CreateSpnIdentity("Server"));
 
BasicHttpBinding basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
 
ChannelFactory<IDataSender> factory = new ChannelFactory<IDataSender>(BasicHttpBinding , address);
MyChannel = factory.CreateChannel();


Попробовал перевести сервис на "Per-Session", но как перевести с HttpBinding на TcpBinding пока не понял
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.10.2015, 10:17
Цитата Сообщение от z0rg Посмотреть сообщение
Это худо бедно работает.
Первое что бросается в глаза: да, таблицы данных сериализуются и поэтому могут использоваться как контракты данных.
Но источники не советуют так делать. В идеале нужно передавать не схему данных (таблицу), а сами данные, в виде массива (или еще какой-то коллекции).
Цитата Сообщение от z0rg Посмотреть сообщение
Попробовал перевести сервис на "Per-Session", но как перевести с HttpBinding на TcpBinding пока не понял
Базовая привязка не поддерживает сеансовые службы, насколько я помню. Для поддержки сеанса можно использовать WsHttpBinding.
В остальном да, код простой, попробую сделать то же у себя. Что именно вам в нем не нравится? Скорость работы?
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
02.10.2015, 11:28  [ТС]
insite2012, как я писал выше, способ передачи данных не принципиален - я пробовал передавать, например, массив структур. Это дело не меняет.
Не нравится то, то что при увеличении числа пользователей(в моем конкретном случае начиная с 5 штук) полностью завешивается серверная часть. Причем если закрыть несколько клиентов(т.е.убрать из очереди на выполнение) без перезагрузки, то работа сервиса восстанавливается.
Машина-хост, конечно, слабенькая, но не настолько.

ЗЫ логику GetData я урезал до минимума, для тестов. там буквально создается таблица с несколькими записями и все.

Добавлено через 10 минут
Нужно сделать так, чтобы запросы от клиентов не выстраивались в синхронную очередь.

Добавлено через 31 минуту
Результаты теста такие: запрос посылается раз в 1 секунду, ответ получается за 0.25 секунды(включая всю серверную логику).
Как только количество клиентов возрастает до 4х штук, то на суммарное обслуживание всех запросов начинает тратится 1 секунда впритык(4 * 0.25). При более чем 5 клиентах появляется накапливающаяся очередь и дальше начинаются проблемы.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.10.2015, 12:53
z0rg, я тут немного поразмыслил, и вот какие выводы.
1. Службу лучше делать как службу уровня вызова, она лучшая по масштабируемости.
2. Исходы из п.п. 1 все вызовы должны быть синхронными, асинхронность не допускается (поскольку по выходу из метода и возврату управления клиенту экземпляр службы сразу же уничтожается.
3. Попробовать добавить в коллекцию аспектов поведения службы аспект, отвечающий за регулирование нагрузки(ServiceThrottlingBehavior, вот он: https://msdn.microsoft.com/ru-... .110).aspx).
4. У меня есть одна работающая служба на хосте в сети, я могу добавить в нее тестовый метод, примерно как ваш, дам ссылку, и протестируете его на производительность по числу подключенных клиентов. Посмотрим, не влияет ли ваша машина, где находится хост.
1
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
02.10.2015, 13:39  [ТС]
insite2012,
1,2. В данной задаче производительность - первичное требование, а масштабируемость и всякие "шашечки" по возможности. Поэтому я готов испробовать любые извращения, чем, собственно, и занимаюсь сейчас. А вот если что-то получится, тогда и буду думать о том, насколько по-индусски вышло и стоит ли это применять.
3. Сейчас попробую.
4. Не вижу пока смысла. Если выясниться, что это мой хост не тянет, то мне от этого легче не станет =).

Если я не найду приемлемого решения, то придется отказаться от удобного WCF и придумать что-то более низкоуровневое.

Добавлено через 17 минут
ServiceThrottlingBehavior ни с минимальными ограничениями, ни с максимальными никак вообще на работу не влияет. Я даже засомнивался, правильно ли я это использовал, но попробовав добавить эти правила другим способом - убедился в их бездейственности в данном случае.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.10.2015, 14:34
Цитата Сообщение от z0rg Посмотреть сообщение
В данной задаче производительность - первичное требование, а масштабируемость и всякие "шашечки" по возможности.
Ну, собственно, вы и получаете производительность (затраты ресурсов распределяются по максимуму). А вот масштабируемости (то есть возможности увеличения числа подключенных клиентов) у вас как раз нет.
Ну и если хостовый компьютер действительно слаб, то вряд ли что-то сможете с этим сделать, по крайней мере, с WCF. Возможно, используя что-то более низкоуровневое...
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.10.2015, 15:21
z0rg, почитайте эту статью
1
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
02.10.2015, 16:07  [ТС]
insite2012, да где же тут производительность, когда маленький запрос вешает даже фоновые потоки =)?
Я все же решил проверить свой хост на другой машине, благо у меня под рукой множество машин с разными системами. Закинул на комп с win7 и нормальным железом - тот же результат(для точности я убрал всю логику и оставил простой sleep).
Что это за хост, который не в состоянии обслуживать несколько клиентов параллельно?... Я уверен, что если я поставлю SQL сервер на ту слабую машину, то она будет в состоянии обслуживать сотню пользователей с такими же запросами. Пускай и медленно, но будет.
Опять возвращаюсь к мысли:
Цитата Сообщение от z0rg Посмотреть сообщение
Наверное, я что-то не так сделал... или это мелкомягкие что-то не так сделали
Добавлено через 33 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
z0rg, почитайте эту статью
Прочел, выглядит интересно! В понедельник испробую
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
03.10.2015, 08:17
z0rg, а чем класс RunMetod не устраивает? Способен без проблем обработать хоть сотни тысяч запросов к источнику от тысяч потоков без всякого зависания системы. Причем запись можно делать асинхронно: “плюнул” порцию данных в источник и забыл. Чтение должно быть синхронным, нужно дождаться результата.
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 08:42  [ТС]
Цитата Сообщение от Dedoc Посмотреть сообщение
Чтение должно быть синхронным
В самом начале топика я искал как раз асинхронного чтения.
Как бы то ни было, в ходе разбирательств выяснилось, что проблема не связана с источником данных вообще.
0
-39 / 2 / 1
Регистрация: 21.09.2015
Сообщений: 58
05.10.2015, 11:33
Цитата Сообщение от z0rg Посмотреть сообщение
Как бы то ни было, в ходе разбирательств выяснилось, что проблема не связана с источником данных вообще
Возможно, проблема связана с раздельным доступом к источнику дпнных.

Цитата Сообщение от z0rg Посмотреть сообщение
В самом начале топика я искал как раз асинхронного чтения.
Полагаю, такого быть не может. Нужно переменной присвоить прочитанное значение, а для этого в момент присвоения значения переменной оно должно быть уже определено, т.е. операция чтения завершена. Можно сделать асинхронным процесс копирования из источника в источник.
1
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 14:35  [ТС]
Готово! Ларчик просто открывался! Можете начинать думать про меня всякие гадости.
Я с самого начала чувствовал, что что-то не так... Я для удобства отладки сервис сделал на винформсе - и в этом было все дело!
Когда я начал пробовать кое-что из той статьи от Psilon, я сделал консольный хост и все просто заработало с настройками из коробки (c per-call и т.д). Нет слов... Несколько дней долбления в дверь, а она открывалась внутрь...
Правда, теперь есть косяк с вызовом событий, но это уже мелочи.
В общем, всем плюсов, пасибо, расходимся.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.10.2015, 14:39
Цитата Сообщение от z0rg Посмотреть сообщение
Ларчик просто открывался!
Цитата Сообщение от z0rg Посмотреть сообщение
есть косяк с вызовом событий
То есть, у вас там использовались Callback-и??? И вы ни слова про это не сказали? Тогда неудивительно, это простой deadlock, раз все именно так.
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 15:13  [ТС]
insite2012, ненене, на тот момент никаких событий не было. Я же говорил, что для тестов я оставил голые вызовы, которые слипами имитировали вид бурной деятельности.

Добавлено через 3 минуты
ЗЫ сейчас, кстати, все и с событиями работает очень быстро, никаких дедлоков. просто пока что сама "карусель" запускается кривым способом. завтра придумаю как сделать красиво.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.10.2015, 15:39
Цитата Сообщение от z0rg Посмотреть сообщение
все и с событиями работает очень быстро, никаких дедлоков
Этот глюк вылезает при использовании приложения WinForm как клиента, с использованием обратных вызовов/событий.
Но есть способ устранения (реентерабельность+CallbackBehavior).
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 15:57  [ТС]
В моем случае виновата была серверная сторона. Сейчас связка <ВинФорм-клиент + консольный хост> летает. Конечно, если при исключении ВинФорма и с клиентской стороны произойдет еще прирост производительности - я буду очень рад, но уже сейчас работа удовлетворительна.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
05.10.2015, 16:08
Цитата Сообщение от z0rg Посмотреть сообщение
Хранятся там несколько тысяч записей и они в реальном времени поштучно обновляются(очень часто) по факту измерения.
Это как то связано с АСУТП?
Цитата Сообщение от z0rg Посмотреть сообщение
И далее есть функция, которая отправляет эти данные на клиент.
Клиенту отправляется вся таблица сразу или только обновления?
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 16:18  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это как то связано с АСУТП?
Да.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Клиенту отправляется вся таблица сразу или только обновления?
В большинстве случаев отправляется выборка, которую запрашивает клиент изходя из своих текущих задач. А эта выборка, в свою очередь, получается из массива данных, который беспрерывно актуализируется на сервеной стороне.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.10.2015, 16:29
z0rg, а зачем вам вообще винформа? Всё это прекрасно оформляется как windows service - просто запускаете службу и включается АПИ, который отдает данные. Надоело или обоновить надо - взяли и остановили. Я такую штуку делал, очень удобно.
0
0 / 0 / 0
Регистрация: 23.09.2015
Сообщений: 29
05.10.2015, 16:29  [ТС]
ЗЫ стоит добавить, что я не изобретаю велосипед на коленке. и конкретно эта небольшая задача не есть АСУТП, а только косается другой системы в точке получения данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.10.2015, 16:29

Сделать копирование в ссылочном типе данных как по значению, так и по ссылке
Ни когда не разбирался с этим фэйлом, но сейчас очень нужно. Сделаю набросок, для наглядности d a = new d(), b = new d(), c = new...

Копирование данных из сетевой БД в локальную
Как реализовать копирование данных из таблицы, находящейся на удаленном MS SQL Server, в аналогичную таблицу, находящуюся в MS SQL Server...

Entity Framework Core копирование данных
Ситуация такая, из одной бд, добавляю одно поле и записываю в другую бд. public class RepositoryShared : DbContext { ...

SqlBulkCopy копирование данных из разных источников
Задача состоит в том чтобы из одного источника данних передать в другой только те записи которих нету в второй таблице подозреваю что нужно...

Копирование базы данных первичный ключ
Привет, у меня такая ситуация. Есть удаленная база данных и есть локальная. При запуске моей программы происходит синхронизация баз...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru