Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про мидас [Win2k]


Страницы:   1 2 3 4 5 6 7 8

Alexander_K ©   (2004-03-10 15:11:00) 

Приветствую всех!

Написал программу, с тонким клиентом, которая работает с БД Оракл.
Instancing - Multiple use
Threading model - Apartment
Возникла следующая проблема:
При запуске в нескольких клиентах одновременно довольно длительный запросов эти запросы не выполняются параллельно! Выяснил это запуском одновременно длинного запроса и короткого. По идее если они выполняются параллельно - короткий закончиться быстрее... На самом же деле заканчиваются они в таком же порядке как и запускались...
Получается что каждое подключение не обрабатывается в отдельном витке на сервере приложений. Об этом свидетельствует то, что форма сервера приложений при выполнении запроса повисает и ее нельзя перетащить и т.д.

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


sniknik   (2004-03-11 13:06:00) [121]

Dok_3D ©   (11.03.04 11:27) [26]
неправильный тест

только изза одного, тестируем потоки а используем VCL функцию ShowMessage из модуля диалогов.
нужно из виндов MessageBox использовать она потоконезависима. а ShowMessage исказит результат (кстати ее и без синхронизации вредно запускать).


Dimk   (2004-03-11 12:56:00) [122]

Да, читал...
И тоже думал что это значит что вызов методов каждого COM
делается в отдельном витке - теперь сомневаюсь, так как
проделал эксперимет предложенный мистером Dok_3D :o)
Сделал так:
В интерфейсе RDM сделал метод (Tttttt - это имя класса моего RDM :o) ):
procedure Tttttt.M;
var
 F: TForm3;
 i: int64;
begin
 F := TForm3.Create(nil);
 i := 0;
 while i <= high(i) do
 begin
   F.Label1.Caption := Format('%d',[i]);
    Application.ProcessMessages;
   Inc(i);
 end;
 F.Free;
end;

Который вызывается из клиентского приложения:

procedure TForm4.Button1Click(Sender: TObject);
begin
 DCOMConnection1.AppServer.M;
end;

так вот что выяснилось:
1. Все работает как и сказал Dok_3D.
2. Если же убрать ProcessMessages ( знаю что формы при этом
  перерисовываться не буду :o| ) почемуто происходит
  умирание и основной формы сервера приложений. А почему же    это происходит? Если бы каждый метод M отдельного COM сервера запускался в одельном витке - главный виток ( Main thread ) в котором кстати вызывается Application.Run ( которая обрабатывает сообщения этого основного витка ) не должен бы умирать.
Проверено на программах в которых для того чтобы
основная форма не умирала при запуске длительных не передающих управления ОС алгоритмов ( не вызываются sleep GetMessage и др функции ) я запускл эти алгоритмы в отдельном витке.

Именно из за умирания основного витка - сомневаюсь что
тут все уж так просто: типа каждый COM в своем витке....


Reindeer Moss Eater   (2004-03-11 11:31:00) [123]

2 Dimk

ApartmentEach instance of your remote data module services one request at a time. However, the DLL may handle multiple requests on separate threads if it creates multiple COM objects. Instance data is safe, but you must guard against thread conflicts on global memory. This is the recommended model when using BDE-enabled datasets. (Note that when using BDE-enabled datasets you must add a session component with AutoSessionName set to True.)


Dok_3D   (2004-03-11 11:27:00) [124]

При запуске в нескольких клиентах одновременно довольно длительный запросов эти запросы не выполняются параллельно! Выяснил это запуском одновременно длинного запроса и короткого.
Получается подключение не обрабатывается в отдельном витке ...

Неправильно ты выяснял.
Забудь ты про Oracle. Он то здесь причем?

Сделай на своем сервере приложений два метода:
function Method1
begin
 sleep(60000);
end;

function Method2
begin
 ShowMessage('Мой мессадж в момент выполния Method1');
end;

Пусть одно клиентское приложение вызовет первый метод.
А второе клиентское приложение в течение минуты пытается вызвать второй.

И сразу все выяснишь, в отдельном, или не в отдельном витке ..


Asdor   (2004-03-10 18:29:00) [125]

Про рантайм я все-таки стормозил наверное :(
покопавшись в DBTables - увидел, что там у TDatabase и TDBDataSet SessionName выставляется в TSession.Notification так что все вроде должно быть с этим нормально (если TSession создается как первый компонент в RDM. если нет - то возможно могут возникнуть проблемы).
Просто я когда писал сервер приложений с RDM'мами после создания RDM сам генерил DatabaseName и выставлял компонетам доступа к данным SessionName и DatabaseName.


Alexander_K   (2004-03-10 18:20:00) [126]

Кстати, сервер internal/external?

У меня екстернал


Dimk   (2004-03-10 18:12:00) [127]

2 Reindeer Moss Eater

Насчет сессий - в доке как раз и описано:
Set AutoSessionName to control whether or not a unique session name is automatically generated. AutoSessionName is intended to guarantee developers of multi-threaded applications that sessions spawned for each thread are unique at runtime.

When AutoSessionName is false (the default), the application must set the SessionName property for a session component. When AutoSessionName is true, TSession assigns the SessionName property automatically and replicates the session name across the SessionName properties of all dataset components in the data module or form where the session component appears. This allows applications to use sessions in data modules that are replicated over multiple threads. TSession constructs a session name by taking the current value of the Name property and appending an underscore (_) followed by a numeric value. For example, if Name is CustomerSession, then the AutoSessionName might be CustomerSession_2.

А вот чтото про герерацию DataBaseName в рантайме я не видел
Если не сложно - вставьте кусочек... где и для чего.


Alexander_K   (2004-03-10 18:09:00) [128]

Кстати, сервер internal/external?

Не очень понял, но оракл стоит на отдельном сервере

Кстати, если Instancing делать Single use, то на каждого клиента запускается отдельный сервер и тогда конечно же все работает...

Но я все-таки думаю не в оракле это, попробую с дбфкой, посмотрю что получиться


Nikolay M.   (2004-03-10 17:59:00) [129]


> Alexander_K ©   (10.03.04 17:29) [17]

Похоже, все правильно. Может, дело в оракле? Я его не знаток :(
Попробуй сделать тестовое приложение и обратиться к Ораклу или DBDEMOS.
Кстати, сервер internal/external?


Reindeer Moss Eater   (2004-03-10 17:39:00) [130]

Имена SessionName, DatabaseName компонентам доступа к данным
надо присваивать в рантайме после их создания,


Если б то было правда - было бы написано в мануале.
А там написано обратное.


Alexander_K   (2004-03-10 17:38:00) [131]

Asdor ©   (10.03.04 17:31) [18]

Дык в датабазе устанавливается свойство Session не на дефаулт, а на ту которую нужно


Asdor   (2004-03-10 17:31:00) [132]

Имена SessionName, DatabaseName компонентам доступа к данным
надо присваивать в рантайме после их создания,
в AfterConstruction например.
Иначе запросы непонятно через какую Session/Database пойдут.
Возможно через единственную "Default".


Alexander_K   (2004-03-10 17:29:00) [133]

Nikolay M. ©   (10.03.04 17:20) [16]

Да


Nikolay M.   (2004-03-10 17:20:00) [134]


> Alexander_K ©   (10.03.04 17:08) [15]
> Nikolay M. ©   (10.03.04 16:32) [13]
> Там свойство AutoSessionName стоит true, по этому оно должно
> имена само генерировать.

А TSession на RDM в единственном экземпляре?


Alexander_K   (2004-03-10 17:08:00) [135]

Nikolay M. ©   (10.03.04 16:32) [13]

Там свойство AutoSessionName стоит true, по этому оно должно имена само генерировать.

Asdor ©   (10.03.04 16:57) [14]

Через DCOMConnection


Asdor   (2004-03-10 16:57:00) [136]

Как клиенты подключаются к RDM?


Nikolay M.   (2004-03-10 16:32:00) [137]

А имена у TSession разные?


Alexander_K   (2004-03-10 16:00:00) [138]

Да конечно TDatabase И TSession лежат в RDM


Dimk   (2004-03-10 15:55:00) [139]

А TDatabase И TSession как раз и лежат в RDM - то есть являются
членами класса наследованного от RDM и таким образом они создаются конструктором RDM во время создания RDM :0)
Они лежат в RDM?


Reindeer Moss Eater   (2004-03-10 15:47:00) [140]

Пофик на RDM'ы.
Хоть миллион их будет.

Нужны отдельные подключенияк серверу БД.
Если это BDE, то отдельные экземпляры TDatabase + TSession на каждого клиента сервера приложений.


Страницы:   1 2 3 4 5 6 7 8

Наверх

Титульная страница Поиск, карта сайта Написать письмо