Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Индикатор длительной работы


Автор: Dimich 8.9.2004, 10:22
Такая вот ситуация: В БД на Oracle есть хранимая процедура, которая выполняет очень длительную работу. Для индикации хода процесса я завел отдельную табличку Indicator и по ходу работы процедуры делаю update indicator и commit. Тут все работает нормально.
Далее в прикладной программе я по таймеру делаю select from indicator и вывожу данные в виде ProgressBar. Работает нормально. Но если я в этой программе создаю отдельный поток и в нем запускаю ту самую хранимую процедуру, то пока она выполняется select from indicator тормозится до ее завершения. В программе я соединяюсь с БД из разных сессий (OraSession1 для select from indicator и OraSession2 для запуска хранимой процедуры). Использую ODAC. Может что не так делаю? Дайте хоть совет!

Автор: LSD 8.9.2004, 15:18
А если попробовать из 2-х разных сессий в SQL+, результат какой?

Автор: Dimich 8.9.2004, 15:25
А если во время работы процедуры делать select from indicator в SQL+, то все нормально выбирается и результат получаем правильный. Делал даже другую программу, которая смотрит табличку Indicator, тоже нормально работает....
А вот в рамках одной программы такая бяка получается............ тормозится select!

Автор: Dimich 9.9.2004, 15:40
Вот одного понять не могу: почему из разных приложений мои select и exec myproc проходят одновременно, а в рамках одного (но в разных потоках и разных сессиях) никак! Может это я что-то делаю не так?

Автор: AntonSaburov 9.9.2004, 15:49
У тебя основной поток вызывает эту до-о-о-о-олгую процедуру ? Если да - то ее вызов надо вынести в другой поток.

Автор: Dimich 9.9.2004, 16:04
Нет, долгая процедура вызывается из отдельного потока (не основного). Вот я думаю, может select from indicator перенести из таймера в отдельный поток.... Хотя какая разница?

Автор: LSD 9.9.2004, 17:39
Попробуй:
Код
select * from indicator nowait

по идее ты должен сразу вывалиться (по моему даже с ошибкой).
Если нет значит проблема не в сервере, а в клиенте, скорее всего используется некий пул соединений, который твои потоки и делят. Можно попробовать в другом потоке соединяться от имени другого пользователя.

Автор: Dimich 10.9.2004, 14:41
select * from indicator nowait - так не проходит. Кажется такая конструкция не поддерживается Ораклом....
Уже думаю бросить эту затею и exec и select вообще зазнести по разным приложениям и связать приложения. Хотя все же интересно, почему так происходит? Ведь разные сессии же? Если докапаюсь, то напишу обязательно!

Автор: LSD 10.9.2004, 18:14
Так должно работать.
Код
SELECT * FROM indicator FOR UPDATE NOWAIT

Автор: Dimich 2.10.2004, 08:09
Нашел я наконец решение этой проблемы (весь отпуск думал)... Просто компоненты ODACа, которыми я пользуюсь из потока надо в этом потоке и создавать динамически (TOraSession, TOraStoredProc, TOraQuery, TOraDataSource). Тогда все работает нормально. А я до этого пытался все это сделать в дизайне! Все оказывается просто! Но спасибо Вам за помощь, это Вы меня на это натолкнули!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)