Индикатор длительной работы

 
0
 
Oracle
ava
Dimich | 08.09.2004, 11:22
Такая вот ситуация: В БД на Oracle есть хранимая процедура, которая выполняет очень длительную работу. Для индикации хода процесса я завел отдельную табличку Indicator и по ходу работы процедуры делаю update indicator и commit. Тут все работает нормально.
Далее в прикладной программе я по таймеру делаю select from indicator и вывожу данные в виде ProgressBar. Работает нормально. Но если я в этой программе создаю отдельный поток и в нем запускаю ту самую хранимую процедуру, то пока она выполняется select from indicator тормозится до ее завершения. В программе я соединяюсь с БД из разных сессий (OraSession1 для select from indicator и OraSession2 для запуска хранимой процедуры). Использую ODAC. Может что не так делаю? Дайте хоть совет!
Comments (9)
ava
LSD | 08.09.2004, 15:18 #
А если попробовать из 2-х разных сессий в SQL+, результат какой?
ava
Dimich | 08.09.2004, 15:25 #
А если во время работы процедуры делать select from indicator в SQL+, то все нормально выбирается и результат получаем правильный. Делал даже другую программу, которая смотрит табличку Indicator, тоже нормально работает....
А вот в рамках одной программы такая бяка получается............ тормозится select!
ava
Dimich | 09.09.2004, 15:40 #
Вот одного понять не могу: почему из разных приложений мои select и exec myproc проходят одновременно, а в рамках одного (но в разных потоках и разных сессиях) никак! Может это я что-то делаю не так?
ava
AntonSaburov | 09.09.2004, 15:49 #
У тебя основной поток вызывает эту до-о-о-о-олгую процедуру ? Если да - то ее вызов надо вынести в другой поток.
ava
Dimich | 09.09.2004, 16:04 #
Нет, долгая процедура вызывается из отдельного потока (не основного). Вот я думаю, может select from indicator перенести из таймера в отдельный поток.... Хотя какая разница?
ava
LSD | 09.09.2004, 17:39 #
Попробуй:
select * from indicator nowait

по идее ты должен сразу вывалиться (по моему даже с ошибкой).
Если нет значит проблема не в сервере, а в клиенте, скорее всего используется некий пул соединений, который твои потоки и делят. Можно попробовать в другом потоке соединяться от имени другого пользователя.
ava
Dimich | 10.09.2004, 14:41 #
select * from indicator nowait - так не проходит. Кажется такая конструкция не поддерживается Ораклом....
Уже думаю бросить эту затею и exec и select вообще зазнести по разным приложениям и связать приложения. Хотя все же интересно, почему так происходит? Ведь разные сессии же? Если докапаюсь, то напишу обязательно!
ava
LSD | 10.09.2004, 18:14 #
Так должно работать.
SELECT * FROM indicator FOR UPDATE NOWAIT
ava
Dimich | 02.10.2004, 08:09 #
Нашел я наконец решение этой проблемы (весь отпуск думал)... Просто компоненты ODACа, которыми я пользуюсь из потока надо в этом потоке и создавать динамически (TOraSession, TOraStoredProc, TOraQuery, TOraDataSource). Тогда все работает нормально. А я до этого пытался все это сделать в дизайне! Все оказывается просто! Но спасибо Вам за помощь, это Вы меня на это натолкнули!
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit