![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выполнить много асинхронных запросов к БД (ADO)? [D6, XP]
Сергей Ю © (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]неа. в БД пишет другая программа, эта только селекты к ней делает.