Завершен

Взаимоблокировка внешнего соединения

Вячеслав Ляутин 8 лет назад обновлен Сергей (Специалист) 8 лет назад 6

В ходе работы системы с внешним соединением на нескольких терминалах сразу была выявлена следующая проблема. По скольку все терминалы обращаются в один и тот же экземпляр внешнего подключения появляются взаимоблокировки.

?К примеру терминалу необходимо получить данные из базы. Создаётся DataReader и считывает данные. Но если в этот же момент другой терминал запросит данные, то в системе будет исключение вида: "?Существует назначенный этой команде открытый DataReader, который требуется предварительно закрыть.?"
Подскажите каким способом можно избежать подобных случаев?

Проект коннектора: https://github.com/vy4eslavik/BPMOnline_Connector

Ну как вариант использовать lock.

https://msdn.microsoft.com/ru-ru/library/c5kehkcz.aspx

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


Благодарю! Решение с использованием lock почти полностью решило проблему.

Почему почти? Должно было полностью.



Как я понял из логов может быть ещё и такая ситуация когда с разных терминалов проводят разные операции. Например один терминал получает информацию об упаковке, а другой перемещает что-то с одной полки на другую. В обоих случаях используются подключение к БД. Таким образом происходит запрос к БД из разных частей кода одновременно.

Таким же образом возможна путаница данных, когда InvokeMethod вызывается с разными аргументами.

Вижу вариант обернуть всё тело метода InvokeMethod в lock() но как это скажется на скорости работы коннектора. Надо проводить тестирование.

Варианты - либо залочить весь вызов, либо много персональных локов по имени функции вызываемой, тут Вам виднее.

Сервис поддержки клиентов работает на платформе UserEcho