Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

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

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

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

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

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


 
Reindeer Moss Eater ©   (2004-03-10 15:14) [1]

Что бы запросы выполялись на Оракле параллельно их надо серверу посылать параллельно.
Из разных сессий и подключений. У тебя это есть?


 
Reindeer Moss Eater ©   (2004-03-10 15:15) [2]

Ну и сам Оракл не должен быть Personal


 
Alexander_K ©   (2004-03-10 15:19) [3]

Да мне кажется оракл тут не причем, я пытался и через BDE такое делать, а там есть компонент Session, который это должен по идее разруливать, но результат такой же.


 
Reindeer Moss Eater ©   (2004-03-10 15:22) [4]

Про Оракл точно наврал. Спутал с локальным IB.

Ну есть TSession и что?
На каждую сессию в сервере приложений должно быть свое подключение к Ораклу.


 
Alexander_K ©   (2004-03-10 15:31) [5]

Дык я так понимаю при подключении клиента должен создаться отдельный ремот дата модуль


 
Reindeer Moss Eater ©   (2004-03-10 15:34) [6]

То что ты это понимаешь, еще не гарантирует что он создается.
А то что он не создается - объясняет поведение твоего сервера приложений.


 
Alexander_K ©   (2004-03-10 15:34) [7]

Дык почему оно не создается-то?


 
Dimk   (2004-03-10 15:44) [8]

Это Легко проверить если ( как и во всех примерах про midas ) повеситься на событие OnCreate у RDM ( Remote Data Module )
и увеличивать некий счетчик, значение которого выводить на
главной форме сервера. Когда я делал аналогичные проэкты - видно что RDM-ы создаются для каждого нового клиентского коннекта. У тебя такой счетчик на сервере есть?


 
Alexander_K ©   (2004-03-10 15:46) [9]

Есть и он меняется


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

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

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


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

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


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

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


 
Nikolay M. ©   (2004-03-10 16:32) [13]

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


 
Asdor ©   (2004-03-10 16:57) [14]

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


 
Alexander_K ©   (2004-03-10 17:08) [15]

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

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

Asdor ©   (10.03.04 16:57) [14]

Через DCOMConnection


 
Nikolay M. ©   (2004-03-10 17:20) [16]


> 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:29) [17]

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

Да


 
Asdor ©   (2004-03-10 17:31) [18]

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


 
Alexander_K ©   (2004-03-10 17:38) [19]

Asdor ©   (10.03.04 17:31) [18]

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


 
Reindeer Moss Eater ©   (2004-03-10 17:39) [20]

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


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


 
Nikolay M. ©   (2004-03-10 17:59) [21]


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

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


 
Alexander_K ©   (2004-03-10 18:09) [22]

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

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

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

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


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

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:20) [24]

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

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


 
Asdor ©   (2004-03-10 18:29) [25]

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


 
Dok_3D ©   (2004-03-11 11:27) [26]

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

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

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

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

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

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


 
Reindeer Moss Eater ©   (2004-03-11 11:31) [27]

2 Dimk

Apartment Each 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.)


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

Да, читал...
И тоже думал что это значит что вызов методов каждого 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 в своем витке....


 
sniknik ©   (2004-03-11 13:06) [29]

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

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


 
Alexander_K ©   (2004-03-11 14:34) [30]

Ну что, будут еще какие-нибудь мысли у кого-нибудь?


 
serge35   (2004-03-11 15:54) [31]

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

Попробуй запустить одни запрос, который будет работать сутки, и за ним запусти запрос, который будет работать 10 сек.

Второй запрос выполнится раньше первого.


 
Dimk   (2004-03-11 15:59) [32]

Вот видоизменил тест немного...
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? Что конкретно в ее структуре мешает?


 
Alexander_K ©   (2004-03-11 16:01) [33]

serge35   (11.03.04 15:54) [31]

Ты не прав


 
Reindeer Moss Eater ©   (2004-03-11 16:03) [34]

Чему равно HandleShared у TDatabase ?


 
Nikolay M. ©   (2004-03-11 16:05) [35]


> Alexander_K ©

А с дбфками проверил?


 
Dimk   (2004-03-11 16:07) [36]

2 serge35
Поверь - это не так! Запросы разных сессий
выполняются параллельно. Даже если предположить
что ты слышал про Oracle MTS - все равно ( если
админ конечно не лох ) существует параметр MTS_MAX_SERVERS
который должен быть достаточно большим чтобы всегда можно было
запустить еще один share server для обработки юзерских запросов если предыдущие уже заняты. Короче маловероятный вариант.


 
Alexander_K ©   (2004-03-11 16:08) [37]

Reindeer Moss Eater ©   (11.03.04 16:03) [34]

У меня true


 
serge35   (2004-03-11 16:08) [38]

Ты хочешь сказать, что если запустить один запрос, который отрабатывает сутки, то в течении суток Оракл не выполнит ни одного другого запроса?


 
Alexander_K ©   (2004-03-11 16:10) [39]

Nikolay M. ©   (11.03.04 16:05) [35]

Нет еще :(( На работе завал :(


 
Dimk   (2004-03-11 16:11) [40]

2 serge35
Извини не врубился сразу...
Выходит что я по поводу оракла как раз с тобой согласен! :o)



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

Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.035 c
3-1080737687
Xim
2004-03-31 16:54
2004.04.25
Хранимая процедура


14-1080578383
Тимохов
2004-03-29 20:39
2004.04.25
предложение


1-1081163428
Dysan
2004-04-05 15:10
2004.04.25
как узнать если свойство у обьекта?


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


9-1067429603
delpher_gray
2003-10-29 15:13
2004.04.25
TDXImageList.Items.Clear ??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский