Страница 1 из 1

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

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

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

Добавлено: 24 мар 2015, 15:11
Borjomy_1
Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.

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

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

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

Добавлено: 25 мар 2015, 09:57
Borjomy_1
У вас запрос одинаковый или изменяется со временем?

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

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

[img]

[/img]

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

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

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

Добавлено: 25 мар 2015, 10:31
dadreamer
В цикле While задержки нет никакой. Это сильно нагружает процессор. И может инициализацию и финализацию БД вынести за цикл? Или тогда работать перестанет?

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

Добавлено: 25 мар 2015, 10:35
Kosist
У Вас локальная переменная ссылки на базу данных вне цикла. И если что-то с ней изменится, то в цикл новое значение не войдет; нужно эту переменную считывать внутри цикла, если на то пошло.
А использование локальных переменных в остальных случаях - это дело вкуса и архитектуры. NI не рекомендует так делать, т.к. это нарушает принцип dataflow.
И еще - если Вы обращаетесь к базе данных по udl файлу, то закрывать-открывать ссылку каждый раз не нужно. Достаточно открыть ее один раз, используя udl файл, и работать дальше с базой данных.

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

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

dadreamer, сомневаюсь насчет пользы задержки, так как в WhileLoop-е делается еще много всего, просто я убрал это из кода для форума, чтобы не отвлекать форумчан лишней информацией. Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.

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

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

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

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

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

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

Добавлено: 25 мар 2015, 11:38
Borjomy_1
Очень может быть, что отруб идет со стороны сервера, который может воспринимать постоянное дергание коннекта как атаку, и в конце концов будет блокировать коннект. Такое я встречал (например в случае, если у таблицы устанавились в результате сбоя не те разрешения, а программа, получая ошибку, пыталась снова и снова восстановить коннект). Ибо без задержек, в данной реализации, идет постоянное открытие/закрытие соединения (причем на максимальной частоте). С точки зрения выделения ресурсов это не есть гуд. Да и с точки зрения программирования тоже. Вы выход ошибки завели на край цикла. В результате вы не знаете - выполнилась ли диаграмма с ошибкой, либо она вообще не выполняется, ожидая соединения.

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

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

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

Добавлено: 25 мар 2015, 15:57
dadreamer
fintbochechki, так вы внесли какие-то изменения в код?

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

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