![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отменение выполнения запроса [D6, Firebird 1.0]
DmitryMN © (2004-08-06 19:10:00)Как послать на сервер Firebird команду для отмены выполняющегося запроса?
GanibalLector (2004-08-11 01:18:00) [1]Кстати,вот только что нашел такую вот информацию
Дает ли Delphi возможность корректно прервать выполнение SQL-запроса (BDE)?
Дает ли Delphi возможность корректно прервать выполнение SQL-запроса к серверу Oracle с помощью BDE? Например, чтобы при использовании с SQL Plus после отправки SQL-запроса на выполнение на экране появлялось окно с кнопкой Cancel, которое давало бы возможность в любой момент прервать выполнение этого запроса?
Насколько мне известно, для этой цели лучше всего использовать функции Oracle Call Interface (низкоуровневый API Oracle). В комплекте поставки Oracle есть соответствующие примеры для C, и переписать их на Pascal несложно.
Некоторые драйверы SQL Link позволяют прекратить выполнение запроса, если время его выполнения превышает заранее заданное значение (параметр MAX QUERY TIME соответствующего драйвера). Однако драйвер ORACLE, к сожалению, в их число не входит.
Fay (2004-08-09 07:46:00) [2]2 VID © (08.08.04 12:54) [18]
Либо Вы путаете код потока с данными потока, либо я не понял, что Вы имели ввиду. У меня тормозов не наблюдалось. Кроме соседа за стеной 8).
DmitryMN (2004-08-08 22:40:00) [3]To DrPass:
Дело в том что программка вроде как локальная, в основном стоит на компах у юзеров, поэтому могут попадаться и слабые машины. Я, например тестирую ее на Celeron 2600/512 RAM/WinXP.
DrPass (2004-08-08 13:02:00) [4]
> Запрос выглядит как select count(*), sum(summa) from table
> записей - 1.5 миллиона,
Это немного. А что за компьютер?
VID (2004-08-08 12:54:00) [5]Fay © (08.08.04 03:27) [17]
Насколько я понимаю, если запустить выполнение запроса через доп. поток, но при этом использую IBDataBase, который создан в контексте основного потока, то тормоза останутся неизменными... Так что новое соединение на каждый поток это не рекомендация - это обязательное условие.
Fay (2004-08-08 03:27:00) [6]2 DmitryMN (08.08.04 02:23) [16]
Пробуй, но учти, что каждый работающий с БД поток должен иметь своё соединение (IBDataBase_или_что_там_у_тебя), а просто так брать и убивать потоки - это живодёрство и добром оно не кончится.
DmitryMN (2004-08-08 02:23:00) [7]спасибо - буду пробовать
GanibalLector (2004-08-08 02:20:00) [8]Ну,тогда выполняй запрос в отдельном потоке.При этом тормоза вообще исчезнут и отменить можно будет в любой момент(убив поток)
DmitryMN (2004-08-08 02:12:00) [9]Запрос выглядит как select count(*), sum(summa) from table
записей - 1.5 миллиона, индексов - 10
DrPass (2004-08-08 00:43:00) [10]
> >этот запрос может отрабатывать до 5 минут
>
> Это ж сколько там записей ?!
Скорее так:
Это ж сколько там индексов?
GanibalLector (2004-08-07 23:13:00) [11]>этот запрос может отрабатывать до 5 минут
И что select count(*) from table выполняется пять минут ???
Johnmen (2004-08-07 21:52:00) [12]>этот запрос может отрабатывать до 5 минут
Это ж сколько там записей ?!
DmitryMN (2004-08-07 20:42:00) [13]Запрос нужен для определения количества строк в таблице и суммы по всем строкам.
На некоторых наборах данных этот запрос может отрабатывать до 5 минут. Если пользователь не захочет так долго ждать - он может отменить запрос. Вот для чего нужна отмена запроса.
To GanibalLector: если запрос выполняется - даже в процедуре - процедура ждет пока он не выполнится и не сможет отменить его в процессе выполнения
Mike Kouzmine (2004-08-07 16:49:00) [14]Можно создать генератор, установить в 0, запустить ХП типа
select
suspend
добавить туда проверку значения генератора и если 1 (выставляет клиент), то выходим.
GanibalLector (2004-08-07 03:34:00) [15]>А как насчет Firebird - в нем можно такое сделать?
А зачем его вообще делать,если запрос будет отменен???Тогда уж лучше вообще запрос не делай.
DmitryMN (2004-08-07 00:58:00) [16]А как насчет Firebird - в нем можно такое сделать?
И самое главное - как это сделать?
DrPass (2004-08-07 00:58:00) [17]Можно просто гронуть соединение
s999 (2004-08-06 19:46:00) [18]Насколько я знаю, в семействе IB это возможно только в IB 6.5-7.1
GRAND25 (2004-08-06 19:37:00) [19]Тогда вызывает интерес, в какой же момент нужно прервать выполнение запроса?
Val (2004-08-06 19:31:00) [20]> [2] DmitryMN (06.08.04 19:26)
можете не пробовать. роллбэк откатывает изменения(после выполнения запроса), а не прерывает запрос.