![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про мидас [Win2k]
Alexander_K © (2004-03-10 15:11:00)Приветствую всех!
Написал программу, с тонким клиентом, которая работает с БД Оракл.
Instancing - Multiple use
Threading model - Apartment
Возникла следующая проблема:
При запуске в нескольких клиентах одновременно довольно длительный запросов эти запросы не выполняются параллельно! Выяснил это запуском одновременно длинного запроса и короткого. По идее если они выполняются параллельно - короткий закончиться быстрее... На самом же деле заканчиваются они в таком же порядке как и запускались...
Получается что каждое подключение не обрабатывается в отдельном витке на сервере приложений. Об этом свидетельствует то, что форма сервера приложений при выполнении запроса повисает и ее нельзя перетащить и т.д.
Народ подскажите как решить данную проблему, хотелось бы чтобы запросы выполнялись параллельно..
serge35 (2004-03-11 16:34:00) [101]Alexander_K - посмотри мой ответ № 38.
и найди 10 отличий в твоем последнем предложении.
Alexander_K (2004-03-11 16:30:00) [102]serge35 (11.03.04 16:25) [46]
И что ты хочешь сказать, что если длинный запрос запустить, то никто больше работать не сможет???
sniknik (2004-03-11 16:30:00) [103]> Хоть в хелпе и сказано, что д.б. True, но чувствую, что должно быть False.
взять да проверить
(гдето там сверху было что счетчик RDM-ом был реализован)
это уже к автору вопроса, переделай чтобы строку показывало вместо чисел в нее вставьляй Database1.SessionName и проследи какие имена при подключении клиентов у тебя выдает. (может действительно все дефаулт)
serge35 (2004-03-11 16:25:00) [104]Оракл ставит запросы в очередь на выполнение.
Сначала запрос обрабатывает оптимизатор, затем только он
начинает выполнятся. После того, как оптимизатор закончил
работу с одним запросом, он берет следующий запрос из очереди.
И как бы вы ни пытались их запустить в паралель, все равно
запросы будут запускаться поочередно.
А то, что более короткий запрос отработал позже более длинного запроса - просто из-за того, что серверу постоянно приходится переключаться от одного запроса к другому, к тому же первый запрос отхватывает для себя больше ресурсов.
Alexander_K (2004-03-11 16:22:00) [105]Reindeer Moss Eater © (11.03.04 16:15) [43]
Попробовал, тоже самое
Reindeer Moss Eater (2004-03-11 16:15:00) [106]Alexander_K © (11.03.04 16:08) [37]
Reindeer Moss Eater © (11.03.04 16:03) [34]
У меня true
Хоть в хелпе и сказано, что д.б. True, но чувствую, что должно быть False.
Иначе все модули данных используют одно и то же подключение.
Отсюда и последовательная обработка запросов
Alexander_K (2004-03-11 16:15:00) [107]serge35 (11.03.04 16:12) [41]
Да я тоже не сразу врубился...
serge35 (2004-03-11 16:12:00) [108]Я знаю, что Oracle Applications, если сервер не может запустить несколько паралельных запросов, то просто добавляется администратор запросов и он их запускает и разруливает.
Reindeer Moss Eater (2004-03-11 16:12:00) [109]serge35
Ты сам-то себе не противоречь, да?
Оракл, насколько я знаю, все запросы ставит в очередь.
Как он выполнит второй запрос, если в очереди есть невыполненный первый
Dimk (2004-03-11 16:11:00) [110]2 serge35
Извини не врубился сразу...
Выходит что я по поводу оракла как раз с тобой согласен! :o)
Alexander_K (2004-03-11 16:10:00) [111]Nikolay M. © (11.03.04 16:05) [35]
Нет еще :(( На работе завал :(
Alexander_K (2004-03-11 16:08:00) [112]Reindeer Moss Eater © (11.03.04 16:03) [34]
У меня true
serge35 (2004-03-11 16:08:00) [113]Ты хочешь сказать, что если запустить один запрос, который отрабатывает сутки, то в течении суток Оракл не выполнит ни одного другого запроса?
Dimk (2004-03-11 16:07:00) [114]2 serge35
Поверь - это не так! Запросы разных сессий
выполняются параллельно. Даже если предположить
что ты слышал про Oracle MTS - все равно ( если
админ конечно не лох ) существует параметр MTS_MAX_SERVERS
который должен быть достаточно большим чтобы всегда можно было
запустить еще один share server для обработки юзерских запросов если предыдущие уже заняты. Короче маловероятный вариант.
Nikolay M. (2004-03-11 16:05:00) [115]
> Alexander_K ©
А с дбфками проверил?
Reindeer Moss Eater (2004-03-11 16:03:00) [116]Чему равно HandleShared у TDatabase ?
Alexander_K (2004-03-11 16:01:00) [117]serge35 (11.03.04 15:54) [31]
Ты не прав
Dimk (2004-03-11 15:59:00) [118]Вот видоизменил тест немного...
procedure Tttttt.M;
var
i: int64;
begin
MessageBox(0, 'AAAAAAAA', 'AAAAAAAAA', 0);
i := 0;
while i <= 999999999 do //high(i) do
begin
Inc(i);
end;
MessageBox(0, 'BBBBBBB', 'BBBBBBBBBB', 0);
end;
Действительно работает параллельно.
При использовании формы ( см предыдущий тест. Кстати причем тут ShowMessage? Форма не диалог и просто создается с свойством Visible == True. ) все както работало не устойчиво и часто
клиент отваливались от сервера, особенно если я запускал их (клиентов) более 2. Основная форма не умирает. Поставил на нее Timer по нему прибаляю счетчик который выводится на главную форму сервера.
Похоже для нормальной многопотоковой работы в RDM годится далеко не все...
Итак... если RDM позволяет многопотоковую работу - то кто же не дает потокам нормально работать? Как в RDM все правильно организовать? Может все проблемы в VCL? Что конкретно в ее структуре мешает?
serge35 (2004-03-11 15:54:00) [119]Оракл, насколько я знаю, все запросы ставит в очередь.
Запустив один запрос, он запускает другой.
Попробуй запустить одни запрос, который будет работать сутки, и за ним запусти запрос, который будет работать 10 сек.
Второй запрос выполнится раньше первого.
Alexander_K (2004-03-11 14:34:00) [120]Ну что, будут еще какие-нибудь мысли у кого-нибудь?