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

Работа с файлами и базами данных

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

Postby fintbochechki on 24 Mar 2015, 14:51

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

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

Postby Borjomy_1 on 24 Mar 2015, 15:11

Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

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

Postby fintbochechki on 25 Mar 2015, 09:53

Borjomy_1, если Вы говорите, что в случае ошибочной command reference будет возникать исключение, то это значит, что ошибка не в command reference. Потому как в кластере ошибок ничего нет. В этом то и необычность сложившейся ситуации. То есть никаких exception нет. Программа с какого то момента времени просто перестала обновлять значения параметров с этой DB.
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0

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

Postby Borjomy_1 on 25 Mar 2015, 09:57

У вас запрос одинаковый или изменяется со временем?
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

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

Postby fintbochechki on 25 Mar 2015, 10:10

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


Вот участок кода, отвечающий за считывание с DB и обновления параметров.

[img]

[/img]
Attachments
1.png
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0

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

Postby fintbochechki on 25 Mar 2015, 10:18

Запрос одинаковый. Код, который я Вам отправил, конечно адаптированный под форум, но то, что касается работы с DB здесь приведено без изменений.
Хочется заметить, что поддержка этого проекта мне досталась "по наследству" от коллег. А сам я программист C# (ну еще C++ и Java, но не LabView), и это не добавляет оптимизма.
Из своего опыта, у меня вызывает сомнения механизм освобождения ресурсов связанных с DB. Правильно ли он реализован?
И насколько правильно каждый раз объявлять переменные, создавать на них ссылки и потом обновлять значения с использованием этих ссылок, как это сделано в проекте на данный момент?
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0

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

Postby dadreamer on 25 Mar 2015, 10:31

В цикле While задержки нет никакой. Это сильно нагружает процессор. И может инициализацию и финализацию БД вынести за цикл? Или тогда работать перестанет?
User avatar
dadreamer
professor
professor
 
Posts: 3149
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 800
I/O VIP vision internet

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

Postby Kosist on 25 Mar 2015, 10:35

У Вас локальная переменная ссылки на базу данных вне цикла. И если что-то с ней изменится, то в цикл новое значение не войдет; нужно эту переменную считывать внутри цикла, если на то пошло.
А использование локальных переменных в остальных случаях - это дело вкуса и архитектуры. NI не рекомендует так делать, т.к. это нарушает принцип dataflow.
И еще - если Вы обращаетесь к базе данных по udl файлу, то закрывать-открывать ссылку каждый раз не нужно. Достаточно открыть ее один раз, используя udl файл, и работать дальше с базой данных.
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 899
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 253
CLAD I/O VIP students

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

Postby fintbochechki on 25 Mar 2015, 10:59

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

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

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

Postby fintbochechki on 25 Mar 2015, 11:05

Мне все-таки интересна последовательность vi, которая без всяких утечек находясь в цикле обеспечивала бы корректное считывание с DB.
Как Вы считаете, последовательность DB Tools Execute Query -> DB Tools Fetch Recordset Data -> DB Tools Free Object соответствует этим критериям?
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0

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

Postby Kosist on 25 Mar 2015, 11:29

fintbochechki wrote:Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.

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

А насчет последовательности - если посмотреть примеры от NI (Help -> Find examples -> по ключевым словам находите примеры), то там функция DB Tools Free Object VI вызывается лишь по окончанию работы приложения. Посмотрите те примеры, может, что-то найдете для себя, сравните со своим кодом...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 899
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 253
CLAD I/O VIP students

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

Postby Borjomy_1 on 25 Mar 2015, 11:38

Очень может быть, что отруб идет со стороны сервера, который может воспринимать постоянное дергание коннекта как атаку, и в конце концов будет блокировать коннект. Такое я встречал (например в случае, если у таблицы устанавились в результате сбоя не те разрешения, а программа, получая ошибку, пыталась снова и снова восстановить коннект). Ибо без задержек, в данной реализации, идет постоянное открытие/закрытие соединения (причем на максимальной частоте). С точки зрения выделения ресурсов это не есть гуд. Да и с точки зрения программирования тоже. Вы выход ошибки завели на край цикла. В результате вы не знаете - выполнилась ли диаграмма с ошибкой, либо она вообще не выполняется, ожидая соединения.
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

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

Postby fintbochechki on 25 Mar 2015, 15:28

Большое спасибо за советы Borjomy_1, dadreamer и Kosist. Пока запустил еще раз на тест. Придется опять ждать длительный промежуток времени до возникновения/не возникновения ошибки.
Пока могу сказать только, что нагрузка на процессор минимальна даже при таком, прямолинейном, коде.
Прошу не закрывать пока тему.
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0

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

Postby dadreamer on 25 Mar 2015, 15:57

fintbochechki, так вы внесли какие-то изменения в код?
User avatar
dadreamer
professor
professor
 
Posts: 3149
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 800
I/O VIP vision internet

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

Postby fintbochechki on 13 Apr 2015, 08:51

Добрый день, господа форумчане!
После перезапуска проекта в режиме 24/7 прошло уже больше 2-ух недель. Проект работает без сбоев.
Возможно, в первый раз ошибка возникла из-за сбоя в сети или чего-нибудь подобного, но заказчик об этом умолчал.
dadreamer, изменения я вносил только в алгоритм записи в другую DB. Там тоже были проблемы, но они лежали на поверхности (сохранялось слишком много лишней информации) и я их решил.
Пожалуй, тему можно закрыть. И еще раз всем спасибо!
fintbochechki
beginner
beginner
 
Posts: 12
Joined: 24 Mar 2015, 14:26
LabVIEW Version: 11
Karma: 0


Return to Сохранение данных

Who is online

Users browsing this forum: No registered users and 2 guests

cron