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

Вниз

Вопрос про мидас   Найти похожие ветки 

 
Alexander_K ©   (2004-03-11 18:41) [80]

roottim   (11.03.04 18:40) [79]

Специально выбрал запросы по разным таблицам, так что тексты здесь не важны


 
Alexander_K ©   (2004-03-11 18:42) [81]

Да и оба запроса читающие!!!


 
roottim   (2004-03-11 18:49) [82]

то-биш выполнение их из 2-х сессий склплас дает нужный результат ?

ежели так, то возвращаемся к мидас серверу


 
Asdor ©   (2004-03-11 19:42) [83]

2 Alexander_K ©
Про запросы...
Открой 2 SQLExplorer"a
Запусти в одном длинный, в другом короткий запрос - и все узнают,
параллельно ли BDE c Oracle выполняют запросы...


 
Reindeer Moss Eater ©   (2004-03-11 22:08) [84]

Не надо упрямо повторять явную фигню про последовательное выполнение запросов в РАЗНЫХ СЕССИЯХ.
Нету никакого последовательного выполнения.
Это вам не локальный интербейс.

Если 5 минут назад главбух в своей сессии запустил расчет баланса который продлится всю ночь, а я к серверу подошел только сейчас, то мой select sysdate from dual выполнится сразу.
И не надо упрямо бубнить про последовательную постановку запросов в очередь на выполнение.
У автора вопроса он по твоему ТРИ МИНУТЫ ставится на выполнение?

У меня точно такой же сервер приложений, но без использования RDM, с точно таким же Ораклом обслуживает клиентов в доп.нитках одного процесса ПАРАЛЛЕЛЬНО.
Запросил один клиент услугу требующую 20 сек - получил результат через 20 сек.
Запросил другой клиент в это же время услугу требующую 1 сек - получил результат через 1 сек.

Итак, что мы выяснили:

-RDM"ов у автора несколько.
-Каждый открывает свое подключение к Ораклу.
-Но тем не менее, клиенты сервера приложений обслуживаются последовательно.

У меня лично осталось одно объяснение этому феномену:

Метод Open у всех датасетов во всех RDM вызывается в одной и той же нити.


 
Michail Dalakov ©   (2004-03-11 23:00) [85]

1.Ctrl+Shift+Esc
Выбираем счетчик потоков и смотрим создается ли новый поток

2.Запускаем OCI Debugger (что то типа MSSQL Profiler) и смотрим, а действительно ли второй запрос попадает на сервер, сразу    после первого.

Метод Open у всех датасетов во всех RDM вызывается в одной и той же нити. Reindeer Moss Eater ©   (11.03.04 22:08) [84]

Так не бывает, для каждого клиента в отдельном потоке на сервере приложений создается обслуживающий COM-объект, поэтому метод
Open вызывается в разных потоках.

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


 
Dimk   (2004-03-12 18:36) [86]

Не ручаюсь как в других версиях Delphi - но я только что попробовал
на Delphi7 с socket connection и с dcom connection.
Использовал компоненты TDataBase, TSession, TQuery, TProvider
(ну как все и рекомендуется в доке и примерах).
У меня запросы работают параллельно.
Переслал мои тесты (экзешники) Alexander_K. Тоже все пашет.
Разница, правда в том что у Alexander_K Borland C++ Builder v5.
Может там какой глюк? Может патчи какие надо поставить?
Поделитесь ссылочками на последние патчи для C++ Builder пожалуйста :o) С благодарностью приму ссылки на патчи к Delphi 7


 
Alexander_K ©   (2004-03-12 19:39) [87]

Dimk   (12.03.04 18:36) [86]

У меня Borland C++ Builder 6


 
Alexander_K ©   (2004-03-15 11:10) [88]

Народ! Дайте ссылки на патчи к Borland C++ Builder 6, если они есть... Пожалуйста!


 
Alexander_K ©   (2004-03-15 11:10) [89]

Народ! Дайте ссылки на патчи к Borland C++ Builder 6, если они есть... Пожалуйста!


 
Alexander_K ©   (2004-03-16 10:20) [90]

Поставил 4 патч на Borland C++ Builder 6 не помогло...


 
Alexander_K ©   (2004-03-16 10:20) [91]

Поставил 4 патч на Borland C++ Builder 6 не помогло...


 
Reindeer Moss Eater ©   (2004-03-16 10:24) [92]

Ты выяснил, кто вызывает методы Open у твоих датасетов ?


 
Alexander_K ©   (2004-03-16 17:54) [93]

Да я и сам пробовал вызывать, и просто ClientDataSet открывать, чтобы он сам открыл запрос - без разници, все так же.


 
serge35   (2004-03-17 11:10) [94]

Спроси об этом у Си - шников, а то они все считают, что Дельфи - это полное фуфло, а Си - рулеззззззззззззз!!!


 
Reindeer Moss Eater ©   (2004-03-17 11:14) [95]

Alexander_K ©   (16.03.04 17:54) [93]
Да я и сам пробовал вызывать, и просто ClientDataSet открывать, чтобы он сам открыл запрос - без разници, все так же.


Так в какой нитке ты это делал сам?
Всегда в одной и той же?


 
Alexander_K ©   (2004-03-17 11:39) [96]

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:56) [97]

Берем событие датасета. Например BeforeOpen.
Внутри него пишем в лог значение GetCurrentThreadID и узнаем всю правду про то, из каких нитей вызван метод Open у этих самых датасетов


 
Alexander_K ©   (2004-03-17 12:14) [98]

Только что я сделал такую фигню, но не в момент открытия датасета, а на создание RDM, вставляя данные в листбокс, и получилось что треад один и тот же!
Хотя Instancing - Multiple use
Threading model - Apartment
Почему так?


 
Reindeer Moss Eater ©   (2004-03-17 12:27) [99]

а на создание RDM

Так ЭрДэЭмы - то наверняка создаются главной ниткой. И на выполнение запросов это не влияет.

Влияет то, из какой нити открываются датасеты.


 
Alexander_K ©   (2004-03-17 12:51) [100]

Пробовал и непосредственно перед Open() Ставить, то же самое, ID один и тот же!!


 
Reindeer Moss Eater ©   (2004-03-17 12:55) [101]

Значит методы Open вызываются из одной нити.
Значит пока не выполнится первый Open у первого клиента, не начнется выполняться второй Open у второго клиента.

Вот и все.


 
Alexander_K ©   (2004-03-17 12:58) [102]

Reindeer Moss Eater ©   (17.03.04 12:55) [101]

Дык это все понятно! Да почему это так????? Должно же быть в разных потоках!


 
Reindeer Moss Eater ©   (2004-03-17 13:00) [103]

А я против разве?


 
Michail Dalakov ©   (2004-03-17 13:10) [104]

Michail Dalakov ©   (11.03.04 23:00) [85]
1.Ctrl+Shift+Esc
Выбираем счетчик потоков и смотрим создается ли новый поток


 
Reindeer Moss Eater ©   (2004-03-17 13:12) [105]

Michail Dalakov ©  

Уже сто лет назад было выяснено, что у автора N датамодулей и N ниток.


 
Michail Dalakov ©   (2004-03-17 13:31) [106]

Так не бывает,

как могут Query лежащие в разных потоках открываться в одном потоке.


 
Reindeer Moss Eater ©   (2004-03-17 13:36) [107]

Начнем с того, что Query ни в каких потоках не лежат.
В потоках выполняется код.


 
Michail Dalakov ©   (2004-03-17 13:51) [108]

Хорошо уберем слэнг и скажем так,

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


 
Reindeer Moss Eater ©   (2004-03-17 14:02) [109]

А что этому может помешать?

Поток №1 вызвал конструктор
Поток №2 присвоил значения свойствам
Поток №3 присвоил значения параметрам
Поток №4 вызвал метод Open
Поток №5 проскроллил датасет с первой записи до десятой
Поток №6 проскроллил датасет с десятой записи до последней
Поток №7 закрыл датасет
Поток №8 вызвал деструктор.

Что невозможного или незаконного в этом?


 
Alexander_K ©   (2004-03-17 14:03) [110]

Michail Dalakov ©   (17.03.04 13:51) [108]

Так вот в этом-то и вопрос, почему Borland C++ Builder 6 создает все в одном потоке?


 
Reindeer Moss Eater ©   (2004-03-17 14:14) [111]

В скольких потоках созданы датамодули и датасеты - рояли не играет.
Важно в каких потоках вызываются методы Open.
Возможно там просто synchronize для этого используется, я не знаю, - тогда все Open идут из одного потока. Главного.


 
Reindeer Moss Eater ©   (2004-03-17 14:21) [112]

В скольких потоках созданы датамодули и датасеты - рояли не играет.
Важно в каких потоках вызываются методы Open.
Возможно там просто synchronize для этого используется, я не знаю, - тогда все Open идут из одного потока. Главного.


 
Michail Dalakov ©   (2004-03-17 14:36) [113]

To Reindeer Moss Eater c   (17.03.04 14:02) [109]
Вопрос не в том возможно это или нет в принципе, вопрос в том, что это абсурд для данного конкретного случая

На каждое клиентское приложение в отдельных потоках на сервере создаются COM-объекты, каждое из клиентских приложений вызывает метод COM-объекта, который в конечном счете приводит к открытию набора данных,

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


 
Michail Dalakov ©   (2004-03-17 14:36) [114]

To Reindeer Moss Eater c   (17.03.04 14:02) [109]
Вопрос не в том возможно это или нет в принципе, вопрос в том, что это абсурд для данного конкретного случая

На каждое клиентское приложение в отдельных потоках на сервере создаются COM-объекты, каждое из клиентских приложений вызывает метод COM-объекта, который в конечном счете приводит к открытию набора данных,

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


 
Nikolay M. ©   (2004-03-17 14:39) [115]

А может транзакции есть блокирующие? Не заметил такой мысли в обсуждении выше.


 
Nikolay M. ©   (2004-03-17 14:41) [116]

А может транзакции есть блокирующие? Не заметил такой мысли в обсуждении выше.


 
Michail Dalakov ©   (2004-03-17 15:06) [117]

To Alexander_K ©   (17.03.04 14:03) [110]
To Reindeer Moss Eater ©   (17.03.04 13:12) [105]

Господа вы как нибудь определитесь в самом деле?

Michail Dalakov ©   (17.03.04 13:10) [104]


 
Reindeer Moss Eater ©   (2004-03-17 15:17) [118]

To Alexander_K ©   (17.03.04 14:03) [110]
To Reindeer Moss Eater ©   (17.03.04 13:12) [105]

Господа вы как нибудь определитесь в самом деле?


Господин Alexander_K в посте 110 говорил о создании датамодулей одним потоком

А господин Reindeer Moss Eater в посте 105 говорил о том, что они создаются и их все же несколько, а не один.


 
Michail Dalakov ©   (2004-03-17 15:18) [119]

To Nikolay M. ©   (17.03.04 14:39) [115]

Оставтье oracle в покое он работает как положенно,

?? А может транзакции есть блокирующие?

это на обычный select * from table? не бывает так.


 
Alexander_K ©   (2004-03-17 15:19) [120]

Сейчас решил посмотреть из диспетчера задач сколько потоков у меня в сервере
При запуске 1 клиента запустился сервер с 4 потоками
При логине к базе в клиенте на сервере стало 5 потоков
При запуске последующих клиентов (6 штук) потоков на сервере не увеличилось!
Выходит как будь-то single...
Но в проекте у меня стоит
Instancing - Multiple use
Threading model - Apartment

В чем грабли?



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

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

Наверх




Память: 0.7 MB
Время: 0.089 c
3-1080431371
Onward
2004-03-28 03:49
2004.04.25
Помогите с Delphi+BDE...


1-1081419182
ctrannik
2004-04-08 14:13
2004.04.25
Работа со звуком


14-1081201005
ИМХО
2004-04-06 01:36
2004.04.25
Знатокам ACDSee


14-1080665686
Usver6000
2004-03-30 20:54
2004.04.25
Как в С++ сделать чтобы проги работала без С++


3-1080215380
Patrick
2004-03-25 14:49
2004.04.25
Работа с компонентом PREPORT.