Чтение данных из DB

Работа с файлами и базами данных
Ответить
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Чтение данных из DB

Сообщение fintbochechki »

Добрый день, господа!
Прошу помочь с решением проблемы считывания данных из DB.
Проект в своей работе использует параметры, которые считываются из существующей базы данных с использованием vi из NI_Database_API.lvlib.
Многочисленные тесты продолжительностью около суток не выявляли никаких проблем. Но после того как проект был запущен в режиме 24/7 на третий день считываемые с базы данных параметры перестали меняться.
При этом DB, из которой берутся данные, функционирует нормально, с сетью проблем также не было (100% информация).
Причина именно в самом проекте.
Есть ли здесь форумчане, которые сталкивались с подобными проблемами?
По первоначальным прикидкам проблема может быть в command reference. Она создается при первоначальном запуске. Возможно, с течением времени эта ссылка перестала указывать на ADO object?
Но тогда vi из NI_Database_API.lvlib выдали бы exception. Или нет?
Пока не выкладываю код, потому что хотел бы убедиться есть ли люди, которые подобные проблемы решали или знают как их решить.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение данных из DB

Сообщение Borjomy_1 »

Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Borjomy_1, если Вы говорите, что в случае ошибочной command reference будет возникать исключение, то это значит, что ошибка не в command reference. Потому как в кластере ошибок ничего нет. В этом то и необычность сложившейся ситуации. То есть никаких exception нет. Программа с какого то момента времени просто перестала обновлять значения параметров с этой DB.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение данных из DB

Сообщение Borjomy_1 »

У вас запрос одинаковый или изменяется со временем?
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Borjomy_1 писал(а):Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.
Вот участок кода, отвечающий за считывание с DB и обновления параметров.

[img]

[/img]
Вложения
1.png
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Запрос одинаковый. Код, который я Вам отправил, конечно адаптированный под форум, но то, что касается работы с DB здесь приведено без изменений.
Хочется заметить, что поддержка этого проекта мне досталась "по наследству" от коллег. А сам я программист C# (ну еще C++ и Java, но не LabView), и это не добавляет оптимизма.
Из своего опыта, у меня вызывает сомнения механизм освобождения ресурсов связанных с DB. Правильно ли он реализован?
И насколько правильно каждый раз объявлять переменные, создавать на них ссылки и потом обновлять значения с использованием этих ссылок, как это сделано в проекте на данный момент?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Чтение данных из DB

Сообщение dadreamer »

В цикле While задержки нет никакой. Это сильно нагружает процессор. И может инициализацию и финализацию БД вынести за цикл? Или тогда работать перестанет?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Чтение данных из DB

Сообщение Kosist »

У Вас локальная переменная ссылки на базу данных вне цикла. И если что-то с ней изменится, то в цикл новое значение не войдет; нужно эту переменную считывать внутри цикла, если на то пошло.
А использование локальных переменных в остальных случаях - это дело вкуса и архитектуры. NI не рекомендует так делать, т.к. это нарушает принцип dataflow.
И еще - если Вы обращаетесь к базе данных по udl файлу, то закрывать-открывать ссылку каждый раз не нужно. Достаточно открыть ее один раз, используя udl файл, и работать дальше с базой данных.
Мы делили апельсин - много наших полегло...
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Kosist, обращение к DB идет по udl файлу и открывается она, как Вы рекомендовали, один раз.
То есть, если следовать канонам NI, лучше объявить переменные вне цикла, а в цикле использовать ссылки на них?
В принципе, будь это программа на C#, я бы так и сделал.

dadreamer, сомневаюсь насчет пользы задержки, так как в WhileLoop-е делается еще много всего, просто я убрал это из кода для форума, чтобы не отвлекать форумчан лишней информацией. Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Мне все-таки интересна последовательность vi, которая без всяких утечек находясь в цикле обеспечивала бы корректное считывание с DB.
Как Вы считаете, последовательность DB Tools Execute Query -> DB Tools Fetch Recordset Data -> DB Tools Free Object соответствует этим критериям?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Чтение данных из DB

Сообщение Kosist »

fintbochechki писал(а):Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.
Скажем так - пользователь не заметит разницу между 1 мс задержкой в обновлении, и 500 мс. А вот процессору будет дышаться легче )) Но если задержки реализованы, то тогда все в порядке.

А насчет последовательности - если посмотреть примеры от NI (Help -> Find examples -> по ключевым словам находите примеры), то там функция DB Tools Free Object VI вызывается лишь по окончанию работы приложения. Посмотрите те примеры, может, что-то найдете для себя, сравните со своим кодом...
Мы делили апельсин - много наших полегло...
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Чтение данных из DB

Сообщение Borjomy_1 »

Очень может быть, что отруб идет со стороны сервера, который может воспринимать постоянное дергание коннекта как атаку, и в конце концов будет блокировать коннект. Такое я встречал (например в случае, если у таблицы устанавились в результате сбоя не те разрешения, а программа, получая ошибку, пыталась снова и снова восстановить коннект). Ибо без задержек, в данной реализации, идет постоянное открытие/закрытие соединения (причем на максимальной частоте). С точки зрения выделения ресурсов это не есть гуд. Да и с точки зрения программирования тоже. Вы выход ошибки завели на край цикла. В результате вы не знаете - выполнилась ли диаграмма с ошибкой, либо она вообще не выполняется, ожидая соединения.
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Большое спасибо за советы Borjomy_1, dadreamer и Kosist. Пока запустил еще раз на тест. Придется опять ждать длительный промежуток времени до возникновения/не возникновения ошибки.
Пока могу сказать только, что нагрузка на процессор минимальна даже при таком, прямолинейном, коде.
Прошу не закрывать пока тему.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Чтение данных из DB

Сообщение dadreamer »

fintbochechki, так вы внесли какие-то изменения в код?
fintbochechki
beginner
beginner
Сообщения: 12
Зарегистрирован: 24 мар 2015, 14:26
Версия LabVIEW: 11
Контактная информация:

Re: Чтение данных из DB

Сообщение fintbochechki »

Добрый день, господа форумчане!
После перезапуска проекта в режиме 24/7 прошло уже больше 2-ух недель. Проект работает без сбоев.
Возможно, в первый раз ошибка возникла из-за сбоя в сети или чего-нибудь подобного, но заказчик об этом умолчал.
dadreamer, изменения я вносил только в алгоритм записи в другую DB. Там тоже были проблемы, но они лежали на поверхности (сохранялось слишком много лишней информации) и я их решил.
Пожалуй, тему можно закрыть. И еще раз всем спасибо!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Сохранение данных»