Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

Как выполнить много асинхронных запросов к БД (ADO)?   Найти похожие ветки 

 
Сергей Ю   (2007-08-24 10:02) [0]

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


 
Sergey13 ©   (2007-08-24 10:08) [1]

> [0] Сергей Ю   (24.08.07 10:02)

Просто ради интереса, если не трудно, расскажи, что за предметная область? Что за задача такая - задавать БД вопросы и не слушать ответы?


 
alshtam ©   (2007-08-24 10:09) [2]

у меня была подобная проблема, когда долго запросы выполнялись, я ее решил оптимизировав запросы  и индексы в БД правильно раставил, отпала необходимость асинхронных запросов


 
Сергей Ю   (2007-08-24 10:21) [3]

Нет ответы надо слушать обязательно. Просто во время обработки запроса необходимо чтоб программа выполняла и другие функции. А как только ответ пришел от БД то выполнила бы еще и обработочку этого ответа :)
Ну например: ставим таймер на раз в секунду на 1 минуту в целом. В нем запрос к БД. А запрос выполняется 5 секунд. Вот надо чтоб все результаты этих запросов программа обработала. Т.е. последний результат при обычной работе может вернуться через 60*5=300 секунд. А если асинхронный режим выбрать то через 60+5сек=65 секунт.
Или я не прав?


 
iXT ©   (2007-08-24 10:28) [4]

Какие запросы? За целостность данных не боитесь?


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

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


 
DVM ©   (2007-08-24 10:34) [6]


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

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


 
Sergey13 ©   (2007-08-24 10:34) [7]

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

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


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


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


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


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


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

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


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

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

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

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

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


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


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

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


 
Ega23 ©   (2007-08-24 11:49) [12]


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


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


 
sniknik ©   (2007-08-24 11:59) [13]

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


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

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


 
sniknik ©   (2007-08-24 12:45) [15]

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

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


 
sniknik ©   (2007-08-24 12:46) [16]

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


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

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


 
Sergey13 ©   (2007-08-24 13:01) [18]

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

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


 
Anatoly Podgoretsky ©   (2007-08-24 13:05) [19]

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

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


 
Ega23 ©   (2007-08-24 13:08) [20]


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


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


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

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:12) [22]


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


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


 
Sergey13 ©   (2007-08-24 13:13) [23]

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


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


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

Как?

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

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


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


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


и чё?


 
Anatoly Podgoretsky ©   (2007-08-24 13:34) [26]

> Ega23  (24.08.2007 13:08:20)  [20]

Это очень простая и жирная лицензия, особенно для Веб сервисов.
Каждому пользователю по лицензии.


 
Anatoly Podgoretsky ©   (2007-08-24 13:36) [27]

> Ega23  (24.08.2007 13:33:25)  [25]

Вообще то трафик считают за период, а не от time_on
Автор почему то другого мнения.


 
Sergey13 ©   (2007-08-24 13:42) [28]

> [24] Сергей Ю   (24.08.07 13:28)
> Не пойдет. Т.к. time_on у всех машин разный.

Он где то лежит в базе? Если да, то привяжи к этому запросу типа

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


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

В том то и дело что в базе этой информации нет. А есть только у меня.
Траффик мне и нужен за период времени. От начала работы компа до текущего момента. А это самое начало у всех компов разное и в БД его нет. Поэтому 100 запросов придется делать все равно.


 
Sergey13 ©   (2007-08-24 13:58) [30]

> [29] Сергей Ю   (24.08.07 13:52)
> А есть только у меня.

ну так добавь табличку в БД - это не страшное вмешательство в структуру.


 
Сергей Ю   (2007-08-24 14:15) [31]


> ну так добавь табличку в БД - это не страшное вмешательство
> в структуру

С правами на селект ;)?


 
sniknik ©   (2007-08-24 14:18) [32]

> Поэтому 100 запросов придется делать все равно.
UNION ALL не поддерживается mysql-ем?


 
Sergey13 ©   (2007-08-24 14:23) [33]

> [31] Сергей Ю   (24.08.07 14:15)
> С правами на селект

Попроси того, кто тебе дал это право самому сделать ее.


 
Сергей Ю   (2007-08-27 13:06) [34]

Время получения данных с БД сократилось с 3 минут до 30-40 секунд. Уже прогресс, щас еще асинхронный запрос прикручу и наверно вобще можно будет жить с этим :)


 
Sergey13 ©   (2007-08-27 13:13) [35]

> [34] Сергей Ю   (27.08.07 13:06)
> Время получения данных с БД сократилось с 3 минут до 30-40 секунд

За счет чего?


 
Сергей Ю   (2007-08-27 14:38) [36]

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


 
sniknik ©   (2007-08-27 14:46) [37]

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


 
Sergey13 ©   (2007-08-27 14:55) [38]

> [36] Сергей Ю   (27.08.07 14:38)

А если твой комп пеерзагрузится (или как то по другому сбросятся старые данные), заново считать будешь?
Можно ли в мускуле обработать запрос к нескольким базам сразу? Это типа (возвращаясь к [30]) если к твоей боевой БД есть только право на селект, можно ли создать рядом еще одну БД с одной таблицей и селектить из 2 баз.


 
Сергей Ю   (2007-08-27 14:55) [39]

Да вот я тоже думаю что договато идет. Это вобщемто обычный лог проксисервера. На серваке mySQL. Я к нему хожу по ADO+ODBC. Может тут "узкое место"? Кстати а обновление драйверов ODBC может помочь увеличить быстродействие?


 
sniknik ©   (2007-08-27 15:07) [40]

> можно ли создать рядом еще одну БД с одной таблицей и селектить из 2 баз.
вряд ли, mysql гетерогенных запросов не поддерживает. (имхо конечно. может уже что нибудь изменилось)

> Может тут "узкое место"?
"узкое место" обычно сидит перед компьютером, и думает что пишет программу.


 
Сергей Ю   (2007-08-27 15:15) [41]


> А если твой комп пеерзагрузится (или как то по другому сбросятся
> старые данные), заново считать будешь?

Собственно мне главное именно за эту минуту посчитать и эту цифирку положить в другое место :) Так что история тут не нужна.

> "узкое место" обычно сидит перед компьютером, и думает что
> пишет программу

Ну дак это понятно. Посему и испрашиваю у гуру помощи :)
Т.е. теперь вопрос сформулируем так:
Как повысить быстродействие выполнения запроса к базе на mySQL? Какими компонентами пользоваться.


 
sniknik ©   (2007-08-27 15:26) [42]

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

> Как повысить быстродействие выполнения запроса к базе на mySQL?
правильно поставить индексы, оптимально составить запрос, исправить структуру под задачу. в зависимости от логики/используемых компонент отключить неиспользуемое но времяемкое (перерисовку по каждой записи например). и т.д.

> Какими компонентами пользоваться.
любыми. это практически непринципиально. но у каждых свои "фенечки", и действовать надо так чтобы их учитывать (а это уже принципиально).


 
Сергей Ю   (2007-08-27 15:31) [43]

:) Отлично
Тогда какие "фенечки" нужно учесть при обращении к mySQL посредством ADO+ODBC?


 
sniknik ©   (2007-08-27 15:34) [44]

а кто работает с mySQL я или ты? по идее тебе лучше знать. я если и вспомню, что так только по аналогии/если мне "что то" "что нибудь" напомнит.



Страницы: 1 2 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.027 c
11-1170931264
Dodfr
2007-02-08 13:41
2007.09.23
Problem with Vista


15-1187850596
KRM
2007-08-23 10:29
2007.09.23
Проблема при передачи даных на Bizerba ST-Terminal.


15-1188156848
Dik59
2007-08-26 23:34
2007.09.23
Странности с установкой RX-компонент


2-1188224368
hahol
2007-08-27 18:19
2007.09.23
простите за глупый вапрос


2-1188361762
rar
2007-08-29 08:29
2007.09.23
сохранить ico бд