|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Проблема следующая. Событие Idle аппликации совершает disconnect от базы данных если 20 минут аппликацию не тревожили. Однако может быть, что в момент отключения работает очень тяжёлый retrieve, длящийся более 20 минут. Как можно проверить перед дисконнектом, "занята" ли в данный момент SQLCA извлечением данных, чтоб не обрубить его на полуслове? Огромное спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2004, 19:14 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Простота залог успеха можно просто смотреть ответ от retrieve )) если он есть или его еще нет ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2004, 19:51 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Проблему нужно расчленить :-) авторочень тяжёлый retrieve, длящийся более 20 минут нужно запихать в отдельный thread (SharedObjectRegister, etc.). Сделать notification object, через который этот thread будет общаться с основным threadом приложения и сообщать о том, что Retrieve завершён. Событие Idle аппликации в свою очередь должно опрашивать или этот notification object, или какую-нить глобальную переменную на предмет можно ли дисконнектится... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2004, 19:59 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Поставить флаг перед выполнением ретрива и сбрасывать его после. Некий аналог семафора. Флаг может быть переменной глобальной либо на коннекте (если их несколько разных). Правда, это удобно, когда у вас есть общий предок у всех DW-DS. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2004, 21:14 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Филипп абсолютно прав. "тяжёлый retrieve, длящийся более 20 минут", следует выносить в отдельный поток, дабы не мешать пользователю выполнять текущую работу, в том числе и с использование БД. Кстати при этом для подключения к БД вы не сможите использовать SQLCA. Так что в этот момент можите спокойно выполнить: Код: plaintext
А вот при закрытии приложения вам действительно потребуется выполнить соответствующие проверки, на предмет выполнения "тяжелого retrieve", в отдельном потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2004, 06:48 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Дело в том, что я должен изменить объект Аппликейшн в приложении, где уже есть куча окон, т.е. обход и изменение существующих объектов - не решение (да и неизвестно, где ритрив длинный, а где нет [некоторые замедлились со временем из-за роста к-ва данных], да и новые окан будут создаваться - пойди упомни, что надо сделать). Решение от меня требуют по принципу "сделал и забыл". Но всё равно спасибо за ответы, товарищи девелоперы! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 12:56 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
2 Komputilisto: Возможно я не прав, но мне кажется, что вам поможет запрос количества открытых транзакций. Если есть открытые транзакции, значит что то работает. Ели нет, то можно рвать связь. Правда, я не уверен, что DW при ретриве делает сначала begin tran а потом commit , но это можно проверить. Еще раз сорри, если я не прав и ввожу Вас в заблуждение. Удачи! --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 13:11 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Навскидку, то что предлагает IKAR не поможет. Если у вас есть общий предок для datawindows, есть общий предок для datastores, то тогда у вас есть шанс на "сделал и забыл". Делаете глобальную boolean gb_retrieveinprogress . В предке(ах) в retrievestart пишете Код: plaintext
Код: plaintext
В событии Idle аппликации проверяете gb_retrieveinprogress... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 19:08 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Спасибо, ребята, но проблема в том, что во многих потомках события RetrieveStart и RetrieveEnd оверрайднуты, из-за чего и возник вопрос можно ли проверить выполняетсая ли Retrieve в данное мгновенье. Поверьте, решение с флагом столь тривиально, что я бы не стал задавать на форуме такой простой вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2004, 11:13 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Ну если в край, выполни по SQLCA SQL запрос и посмотри на код ошибки. Если коннект активен, то код своеобразен, можно понять, что идет основной запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2004, 13:44 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
авторЕсли коннект активен, то код своеобразен, да уж, в зависимости от БД (например Oracle 8+/native drivers) своеобразность превращается в GPF :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2004, 19:42 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
Я исследовал проблему и выяснил, что её просто нет. Отсчёт секунд до запуска события Idle начинается после последней активности, причём активность - это не только нажатие клавиши или сдвиг мыши, но и retrieve. Морочат голову мне, а я вам... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 16:28 |
|
Проверка или в данный момент происходит Retrieve
|
|||
---|---|---|---|
#18+
2 Komputilisto: Поздравляю с "самоликвидацией" проблемы! Кстати говоря, спасибо что сказали об этом - будем знать на будущее, а то мало ли где столкнуться придется... Удачи! --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 16:34 |
|
|
start [/forum/topic.php?fid=15&fpage=107&tid=1339215]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 238ms |
total: | 415ms |
0 / 0 |