Чтение данных из DB
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Чтение данных из DB
Добрый день, господа!
Прошу помочь с решением проблемы считывания данных из DB.
Проект в своей работе использует параметры, которые считываются из существующей базы данных с использованием vi из NI_Database_API.lvlib.
Многочисленные тесты продолжительностью около суток не выявляли никаких проблем. Но после того как проект был запущен в режиме 24/7 на третий день считываемые с базы данных параметры перестали меняться.
При этом DB, из которой берутся данные, функционирует нормально, с сетью проблем также не было (100% информация).
Причина именно в самом проекте.
Есть ли здесь форумчане, которые сталкивались с подобными проблемами?
По первоначальным прикидкам проблема может быть в command reference. Она создается при первоначальном запуске. Возможно, с течением времени эта ссылка перестала указывать на ADO object?
Но тогда vi из NI_Database_API.lvlib выдали бы exception. Или нет?
Пока не выкладываю код, потому что хотел бы убедиться есть ли люди, которые подобные проблемы решали или знают как их решить.
Прошу помочь с решением проблемы считывания данных из DB.
Проект в своей работе использует параметры, которые считываются из существующей базы данных с использованием vi из NI_Database_API.lvlib.
Многочисленные тесты продолжительностью около суток не выявляли никаких проблем. Но после того как проект был запущен в режиме 24/7 на третий день считываемые с базы данных параметры перестали меняться.
При этом DB, из которой берутся данные, функционирует нормально, с сетью проблем также не было (100% информация).
Причина именно в самом проекте.
Есть ли здесь форумчане, которые сталкивались с подобными проблемами?
По первоначальным прикидкам проблема может быть в command reference. Она создается при первоначальном запуске. Возможно, с течением времени эта ссылка перестала указывать на ADO object?
Но тогда vi из NI_Database_API.lvlib выдали бы exception. Или нет?
Пока не выкладываю код, потому что хотел бы убедиться есть ли люди, которые подобные проблемы решали или знают как их решить.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Чтение данных из DB
Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Borjomy_1, если Вы говорите, что в случае ошибочной command reference будет возникать исключение, то это значит, что ошибка не в command reference. Потому как в кластере ошибок ничего нет. В этом то и необычность сложившейся ситуации. То есть никаких exception нет. Программа с какого то момента времени просто перестала обновлять значения параметров с этой DB.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Вот участок кода, отвечающий за считывание с DB и обновления параметров.Borjomy_1 писал(а):Вы уверены в том, что запрос формируется корректно в процессе работы? В том смысле, что вы собственными глазами видите текст запроса в реальном времени. И результат выполнения функции, в том числе ошибки. Если command reference указан неверно, то будет возникать ошибка, которую вы должны увидеть в кластере Errors.
[img]
[/img]
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Запрос одинаковый. Код, который я Вам отправил, конечно адаптированный под форум, но то, что касается работы с DB здесь приведено без изменений.
Хочется заметить, что поддержка этого проекта мне досталась "по наследству" от коллег. А сам я программист C# (ну еще C++ и Java, но не LabView), и это не добавляет оптимизма.
Из своего опыта, у меня вызывает сомнения механизм освобождения ресурсов связанных с DB. Правильно ли он реализован?
И насколько правильно каждый раз объявлять переменные, создавать на них ссылки и потом обновлять значения с использованием этих ссылок, как это сделано в проекте на данный момент?
Хочется заметить, что поддержка этого проекта мне досталась "по наследству" от коллег. А сам я программист C# (ну еще C++ и Java, но не LabView), и это не добавляет оптимизма.
Из своего опыта, у меня вызывает сомнения механизм освобождения ресурсов связанных с DB. Правильно ли он реализован?
И насколько правильно каждый раз объявлять переменные, создавать на них ссылки и потом обновлять значения с использованием этих ссылок, как это сделано в проекте на данный момент?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Чтение данных из DB
В цикле While задержки нет никакой. Это сильно нагружает процессор. И может инициализацию и финализацию БД вынести за цикл? Или тогда работать перестанет?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Чтение данных из DB
У Вас локальная переменная ссылки на базу данных вне цикла. И если что-то с ней изменится, то в цикл новое значение не войдет; нужно эту переменную считывать внутри цикла, если на то пошло.
А использование локальных переменных в остальных случаях - это дело вкуса и архитектуры. NI не рекомендует так делать, т.к. это нарушает принцип dataflow.
И еще - если Вы обращаетесь к базе данных по udl файлу, то закрывать-открывать ссылку каждый раз не нужно. Достаточно открыть ее один раз, используя udl файл, и работать дальше с базой данных.
А использование локальных переменных в остальных случаях - это дело вкуса и архитектуры. NI не рекомендует так делать, т.к. это нарушает принцип dataflow.
И еще - если Вы обращаетесь к базе данных по udl файлу, то закрывать-открывать ссылку каждый раз не нужно. Достаточно открыть ее один раз, используя udl файл, и работать дальше с базой данных.
Мы делили апельсин - много наших полегло...
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Kosist, обращение к DB идет по udl файлу и открывается она, как Вы рекомендовали, один раз.
То есть, если следовать канонам NI, лучше объявить переменные вне цикла, а в цикле использовать ссылки на них?
В принципе, будь это программа на C#, я бы так и сделал.
dadreamer, сомневаюсь насчет пользы задержки, так как в WhileLoop-е делается еще много всего, просто я убрал это из кода для форума, чтобы не отвлекать форумчан лишней информацией. Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.
То есть, если следовать канонам NI, лучше объявить переменные вне цикла, а в цикле использовать ссылки на них?
В принципе, будь это программа на C#, я бы так и сделал.
dadreamer, сомневаюсь насчет пользы задержки, так как в WhileLoop-е делается еще много всего, просто я убрал это из кода для форума, чтобы не отвлекать форумчан лишней информацией. Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Мне все-таки интересна последовательность vi, которая без всяких утечек находясь в цикле обеспечивала бы корректное считывание с DB.
Как Вы считаете, последовательность DB Tools Execute Query -> DB Tools Fetch Recordset Data -> DB Tools Free Object соответствует этим критериям?
Как Вы считаете, последовательность DB Tools Execute Query -> DB Tools Fetch Recordset Data -> DB Tools Free Object соответствует этим критериям?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Чтение данных из DB
Скажем так - пользователь не заметит разницу между 1 мс задержкой в обновлении, и 500 мс. А вот процессору будет дышаться легче )) Но если задержки реализованы, то тогда все в порядке.fintbochechki писал(а):Кроме того, данные должны быть актуальны, и, даже не смотря на их небольшую скорость изменения с течением времени, должны обновляться с высокой частотой.
А насчет последовательности - если посмотреть примеры от NI (Help -> Find examples -> по ключевым словам находите примеры), то там функция DB Tools Free Object VI вызывается лишь по окончанию работы приложения. Посмотрите те примеры, может, что-то найдете для себя, сравните со своим кодом...
Мы делили апельсин - много наших полегло...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Чтение данных из DB
Очень может быть, что отруб идет со стороны сервера, который может воспринимать постоянное дергание коннекта как атаку, и в конце концов будет блокировать коннект. Такое я встречал (например в случае, если у таблицы устанавились в результате сбоя не те разрешения, а программа, получая ошибку, пыталась снова и снова восстановить коннект). Ибо без задержек, в данной реализации, идет постоянное открытие/закрытие соединения (причем на максимальной частоте). С точки зрения выделения ресурсов это не есть гуд. Да и с точки зрения программирования тоже. Вы выход ошибки завели на край цикла. В результате вы не знаете - выполнилась ли диаграмма с ошибкой, либо она вообще не выполняется, ожидая соединения.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Большое спасибо за советы Borjomy_1, dadreamer и Kosist. Пока запустил еще раз на тест. Придется опять ждать длительный промежуток времени до возникновения/не возникновения ошибки.
Пока могу сказать только, что нагрузка на процессор минимальна даже при таком, прямолинейном, коде.
Прошу не закрывать пока тему.
Пока могу сказать только, что нагрузка на процессор минимальна даже при таком, прямолинейном, коде.
Прошу не закрывать пока тему.
-
- beginner
- Сообщения: 12
- Зарегистрирован: 24 мар 2015, 14:26
- Версия LabVIEW: 11
- Контактная информация:
Re: Чтение данных из DB
Добрый день, господа форумчане!
После перезапуска проекта в режиме 24/7 прошло уже больше 2-ух недель. Проект работает без сбоев.
Возможно, в первый раз ошибка возникла из-за сбоя в сети или чего-нибудь подобного, но заказчик об этом умолчал.
dadreamer, изменения я вносил только в алгоритм записи в другую DB. Там тоже были проблемы, но они лежали на поверхности (сохранялось слишком много лишней информации) и я их решил.
Пожалуй, тему можно закрыть. И еще раз всем спасибо!
После перезапуска проекта в режиме 24/7 прошло уже больше 2-ух недель. Проект работает без сбоев.
Возможно, в первый раз ошибка возникла из-за сбоя в сети или чего-нибудь подобного, но заказчик об этом умолчал.
dadreamer, изменения я вносил только в алгоритм записи в другую DB. Там тоже были проблемы, но они лежали на поверхности (сохранялось слишком много лишней информации) и я их решил.
Пожалуй, тему можно закрыть. И еще раз всем спасибо!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 0 Ответы
- 503 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 875 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1225 Просмотры
-
Последнее сообщение Boxa
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 13 Ответы
- 2454 Просмотры
-
Последнее сообщение rsv