Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выполнить много асинхронных запросов к БД (ADO)? [D6, XP]


Страницы:   1 2 3

Сергей Ю ©   (2007-08-24 10:02:00) 

Есть БД к которой нужно довольно часто обращаться, при этом программа должна работать дальше не дожидаясь когда придет результат. Хочу сделать асинхронные запросы (вроде именно это и должно мне помочь). Но вот как сделать чтоб создавался следущий запрос если еще и первый то не успел выполниться? И как узнать потом в обработчике onfetch какой именно из запросов выполнился?


Сергей Ю   (2007-08-24 13:28:00) [21]


> Если ты ещё побольше подумаешь, то выяснится, что и это
> лишнее, а проблему ещё изящнее можно решить

Как?

> select ip,sum(bytes) from table where port=3128 and time>time_on
> group by ip

Не пойдет. Т.к. time_on у всех машин разный.


Sergey13   (2007-08-24 13:13:00) [22]

select ip,sum(bytes) from table where port=3128 and time>time_on
group by ip


Ega23   (2007-08-24 13:12:00) [23]


> Вот только сижу я щас и думаю, а ведь наверно дурак я. Зачем
> мне постоянно считать от времени включения машины до текущего?


Если ты ещё побольше подумаешь, то выяснится, что и это лишнее, а проблему ещё изящнее можно решить.
Не кидайся с ходу "кодить". Привыкай вначале думать.


Сергей Ю   (2007-08-24 13:09:00) [24]

ip,port,bytes,time
т.к. компы включают в разное время то делаю так:
select sum(bytes) from table where ip='ip' and port=3128 and time>time_on

где ip-ipшник машины траффик которого надобы посчитать
time_on-время когда она начала свою сессию (это время я знаю).

Вот только сижу я щас и думаю, а ведь наверно дурак я. Зачем мне постоянно считать от времени включения машины до текущего? Ведь проще будет просто запоминать время последнего подсчета траффика и складывать уже имеющуюся цифирь с периодом от посленего обращения к бд до настоящего времени (т.е. за последнюю минуту)
Блин и не надо лопатить всю БД :)
Ну я и тормоз :)


Ega23   (2007-08-24 13:08:00) [25]


> Лицензии они разные могут быть, ты вроде об МС - лицензия
> на устройство.


На Oracle, вроде, такая же. Хотя могу ошибаться - давно дело было.


Anatoly Podgoretsky   (2007-08-24 13:05:00) [26]

> Ega23  (24.08.2007 11:49:12)  [12]

Лицензии они разные могут быть, ты вроде об МС - лицензия на устройство.


Sergey13   (2007-08-24 13:01:00) [27]

> [17] Сергей Ю   (24.08.07 12:55)
> Причем архитиктура БД такова что одним запросом я не могу получить результат для всех.

То, что ты не можешь еше не говорит, что нельзя вообще. Публикуй структуру - может чего и насоветуют.


Сергей Ю   (2007-08-24 12:55:00) [28]

ну ладно колюсь :): мне надо постоянно считать потребленный за минуту траффик 100 компов. траффик лежит в mysql-ой базе. когда все 100 висят в инете, то БД довольно большая (поменять ее архитиктуру и т.п. я не могу, она не моя). Причем архитиктура БД такова что одним запросом я не могу получить результат для всех. Т.е приходится раз в минуту создавать 100 запросов. А эти 100 запросов частенько не могут обработаться за минуту. При этом программа просто "тупо висит" пока их все дождется.И реально возникает ситуация когда она вобще перестает на чтолибо реагировать. А надо бы чтоб она контролировала получаемую информацию и постоянно ее выводила на экран. Вот.


sniknik   (2007-08-24 12:46:00) [29]

+ к 1, там не только сложнее с асинхронными но еще и бесполезно, т.к. никакой выгоды от них нет.


sniknik   (2007-08-24 12:45:00) [30]

> а в потоке запрос делать обычным? или асинхронным?
в потоках с обычными проще, для асинхронных еще придётся делать выборку/обработку сообщений для потока.

> и почему нельзя просто ограничиться асинхронными запросами?
кто сказал? просто изза того, что никто не знает что же ты там делаешь и зачем, тебе и дали варианты, которые на самом деле лучше подходят тем кто их давал, а вовсе не тебе.


Сергей Ю   (2007-08-24 12:09:00) [31]

база mysql
а в потоке запрос делать обычным? или асинхронным?
и почему нельзя просто ограничиться асинхронными запросами?


sniknik   (2007-08-24 11:59:00) [32]

> Считается за один коннект
ну да, особенно если у него например Firebird Embeded. ;о)) ... база то как вижу не озвучена.


Ega23   (2007-08-24 11:49:00) [33]


> тут проблема какая - насколько я помню множественный коннект
> к базе может противоречить лицензии на базу.


Я с дилерами консультировался по этому вопросу. Считается за один коннект. И если несколько программ с одного IP работают с одним и тем же сервером - тоже как один коннект считается. Или, типа, апп-сервера: 5 клиентов, шестой - апп-сервер, седьмой - сервер БД. клиенты работают только с апп-сервером, а тот - уже с сервером БД. Но считается, вроде, всего 5 коннектов.


DVM   (2007-08-24 11:36:00) [34]


> насколько я помню множественный коннект к базе может противоречить
> лицензии на базу.

Это вряд ли. Несколько подключений к серверу с одного компьютера вроде как не считаются отдельными подключениями, т.е. не требуют отдельных лицензий.


Суслик   (2007-08-24 10:57:00) [35]

Ноль в чем
В потоках?
Или в АДО?

1. создаешь поток. не забудь в потоке вызывать coinitialize(nil) (иначе в потоке адо работать не будет).
2. создаешь в потоке новый AdoConnection.
3. посылаешь в потоке запросы.
4. там же обрабатываешь ответы.
5. при появлении нового задания см. п. 1

но это очень плохая архитектура. тут проблема какая - насколько я помню множественный коннект к базе может противоречить лицензии на базу. поэтому сделай один доп. поток в нем и обращайся к БД.

возможно, что тебе этого всего не нужно :)
достаточно сделать очередь запросов. а обрабатывать их последовательно в единственном доп. потоке.


Сергей Ю   (2007-08-24 10:48:00) [36]


> Работай с БД из нескольких параллельных потоков. Только
> учти, что в каждом потоке надо создавать свой AdoConnection

А как это? Я ноль в этом.


Суслик   (2007-08-24 10:46:00) [37]


>  [6] DVM ©   (24.08.07 10:34)
> Работай с БД из нескольких параллельных потоков. Только
> учти, что в каждом потоке надо создавать свой AdoConnection


поддерживаю
у меня так и сделано.


Sergey13   (2007-08-24 10:34:00) [38]

> [3] Сергей Ю   (24.08.07 10:21)

Это все понятно. Мне интересно зачем это надо по жизни? Что за данные ты запрашиваешь раз в секунду?
Это не совсем праздный интерес - очень часто коллективный разум подсказывает вопрошающему более оптимальные методы работы, отметающие такие возможности в принципе.


DVM   (2007-08-24 10:34:00) [39]


> Просто во время обработки запроса необходимо чтоб программа
> выполняла и другие функции. А как только ответ пришел от
> БД то выполнила бы еще и обработочку этого ответа :)

Работай с БД из нескольких параллельных потоков. Только учти, что в каждом потоке надо создавать свой AdoConnection.


Сергей Ю   (2007-08-24 10:30:00) [40]

неа. в БД пишет другая программа, эта только селекты к ней делает.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо