| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Попробуй:
по идее ты должен сразу вывалиться (по моему даже с ошибкой). Если нет значит проблема не в сервере, а в клиенте, скорее всего используется некий пул соединений, который твои потоки и делят. Можно попробовать в другом потоке соединяться от имени другого пользователя. |
| Автор: Dimich 10.9.2004, 14:41 |
| select * from indicator nowait - так не проходит. Кажется такая конструкция не поддерживается Ораклом.... Уже думаю бросить эту затею и exec и select вообще зазнести по разным приложениям и связать приложения. Хотя все же интересно, почему так происходит? Ведь разные сессии же? Если докапаюсь, то напишу обязательно! |
| Автор: LSD 10.9.2004, 18:14 | ||
Так должно работать.
|
| Автор: Dimich 2.10.2004, 08:09 |
| Нашел я наконец решение этой проблемы (весь отпуск думал)... Просто компоненты ODACа, которыми я пользуюсь из потока надо в этом потоке и создавать динамически (TOraSession, TOraStoredProc, TOraQuery, TOraDataSource). Тогда все работает нормально. А я до этого пытался все это сделать в дизайне! Все оказывается просто! Но спасибо Вам за помощь, это Вы меня на это натолкнули! |