![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос про мидас [Win2k]
Alexander_K © (2004-03-10 15:11:00)Приветствую всех!
Написал программу, с тонким клиентом, которая работает с БД Оракл.
Instancing - Multiple use
Threading model - Apartment
Возникла следующая проблема:
При запуске в нескольких клиентах одновременно довольно длительный запросов эти запросы не выполняются параллельно! Выяснил это запуском одновременно длинного запроса и короткого. По идее если они выполняются параллельно - короткий закончиться быстрее... На самом же деле заканчиваются они в таком же порядке как и запускались...
Получается что каждое подключение не обрабатывается в отдельном витке на сервере приложений. Об этом свидетельствует то, что форма сервера приложений при выполнении запроса повисает и ее нельзя перетащить и т.д.
Народ подскажите как решить данную проблему, хотелось бы чтобы запросы выполнялись параллельно..
Reindeer Moss Eater (2004-03-17 14:02:00) [41]А что этому может помешать?
Поток №1 вызвал конструктор
Поток №2 присвоил значения свойствам
Поток №3 присвоил значения параметрам
Поток №4 вызвал метод Open
Поток №5 проскроллил датасет с первой записи до десятой
Поток №6 проскроллил датасет с десятой записи до последней
Поток №7 закрыл датасет
Поток №8 вызвал деструктор.
Что невозможного или незаконного в этом?
Michail Dalakov (2004-03-17 13:51:00) [42]Хорошо уберем слэнг и скажем так,
как могут экземпляры объектов созданные в разных потоках окрываться в одном потоке?
Reindeer Moss Eater (2004-03-17 13:36:00) [43]Начнем с того, что Query ни в каких потоках не лежат.
В потоках выполняется код.
Michail Dalakov (2004-03-17 13:31:00) [44]Так не бывает,
как могут Query лежащие в разных потоках открываться в одном потоке.
Reindeer Moss Eater (2004-03-17 13:12:00) [45]Michail Dalakov ©
Уже сто лет назад было выяснено, что у автора N датамодулей и N ниток.
Michail Dalakov (2004-03-17 13:10:00) [46]Michail Dalakov © (11.03.04 23:00) [85]
1.Ctrl+Shift+Esc
Выбираем счетчик потоков и смотрим создается ли новый поток
Reindeer Moss Eater (2004-03-17 13:00:00) [47]А я против разве?
Alexander_K (2004-03-17 12:58:00) [48]Reindeer Moss Eater © (17.03.04 12:55) [101]
Дык это все понятно! Да почему это так????? Должно же быть в разных потоках!
Reindeer Moss Eater (2004-03-17 12:55:00) [49]Значит методы Open вызываются из одной нити.
Значит пока не выполнится первый Open у первого клиента, не начнется выполняться второй Open у второго клиента.
Вот и все.
Alexander_K (2004-03-17 12:51:00) [50]Пробовал и непосредственно перед Open() Ставить, то же самое, ID один и тот же!!
Reindeer Moss Eater (2004-03-17 12:27:00) [51]а на создание RDM
Так ЭрДэЭмы - то наверняка создаются главной ниткой. И на выполнение запросов это не влияет.
Влияет то, из какой нити открываются датасеты.
Alexander_K (2004-03-17 12:14:00) [52]Только что я сделал такую фигню, но не в момент открытия датасета, а на создание RDM, вставляя данные в листбокс, и получилось что треад один и тот же!
Хотя Instancing - Multiple use
Threading model - Apartment
Почему так?
Reindeer Moss Eater (2004-03-17 11:56:00) [53]Берем событие датасета. Например BeforeOpen.
Внутри него пишем в лог значение GetCurrentThreadID и узнаем всю правду про то, из каких нитей вызван метод Open у этих самых датасетов
Alexander_K (2004-03-17 11:39:00) [54]serge35 (17.03.04 11:10) [94]
Это надумано
Reindeer Moss Eater © (17.03.04 11:14) [95]
Я делал метод у сервера, в который передавался запрос через параметр, а я присваивал его Query и поле этого делал Open.
А в какой ветке оно вызывается - в этом и вопрос!
В делфи похоже вызывается в разных нитках, а как это делается в C++ Builder??
Reindeer Moss Eater (2004-03-17 11:14:00) [55]Alexander_K © (16.03.04 17:54) [93]
Да я и сам пробовал вызывать, и просто ClientDataSet открывать, чтобы он сам открыл запрос - без разници, все так же.
Так в какой нитке ты это делал сам?
Всегда в одной и той же?
serge35 (2004-03-17 11:10:00) [56]Спроси об этом у Си - шников, а то они все считают, что Дельфи - это полное фуфло, а Си - рулеззззззззззззз!!!
Alexander_K (2004-03-16 17:54:00) [57]Да я и сам пробовал вызывать, и просто ClientDataSet открывать, чтобы он сам открыл запрос - без разници, все так же.
Reindeer Moss Eater (2004-03-16 10:24:00) [58]Ты выяснил, кто вызывает методы Open у твоих датасетов ?
Alexander_K (2004-03-16 10:20:00) [59]Поставил 4 патч на Borland C++ Builder 6 не помогло...
Alexander_K (2004-03-16 10:20:00) [60]Поставил 4 патч на Borland C++ Builder 6 не помогло...