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

Вниз

Многопоточный сервер приложения   Найти похожие ветки 

 
Кодер ©   (2004-10-06 15:18) [0]

Подскажите, пожалуйста, при помощи какой связки компонент можно создать сервер приложения, который будет обрабатывать одновременно множество (т.е. будет обеспечивать многопочность обработки) входящих клиентских запросов и при этом будет использовать НЕ ОДНО, а множество соединений с базой данных, т.е. чтобы также обеспечить многопоточность обработки запросов от сервера приложения к базе данных.


 
Digitman ©   (2004-10-06 15:22) [1]

широкоизвестные TServerSocket или TIdTCPServer - это транспортный уровень

а компоненты уровеня доступа к БД - выбирай любой на твой вкус


 
Erik1 ©   (2004-10-06 16:49) [2]

Если будет com сервер, то надо выбрать модель Free или tmBoth.


 
Суслик ©   (2004-10-06 16:50) [3]


> то надо выбрать модель Free или tmBoth.

угу, и еще реализацию так написать, чтобы она соотвествовала free.


 
Romkin ©   (2004-10-06 18:13) [4]

Apartment обычно достаточно :)
Кстати, и для Both модели мидас сервер написать несложно...


 
Кодер ©   (2004-10-06 18:34) [5]


> TO Digitman ©  


Я хотел использовать ADOConnection и соответсвенно все остальные компоненты "адошные". Сможет ли сервер приложения при использовании TSocketServer какждый отдельный поток-запрос от клиента перенаправлять ОТДЕЛЬНЫМ потоком-запросом в БД через ADOConnection?


> ВСЕМ


Если я не ошибаюсь, то при использовании DCOM указывается комп тока в твоем домене, т.е. ссылка на сервер приложения идет по имени компьютера в сети, на котором установлен сервер приложения, а это неудобно. Хотел использовать для соединения компонент TSocketConnection, но он требует на стороне сервера запущенного сокет-сервера от Borland. :-(

Мне бы хотелось бы имет многопоточность обработки запросов на всех уровнях ентой 3-х уровневой системы, ПЛЮС к этому, чтобы тонкий клиент ссылался к северу приложения по IP-адресу сервака и при том не нехотелось бы на компе с сервером приложения запускать еще какие-то программки для корректной работы всей этой системы (как например запуск Borland сокет-сервера в случае с использованием TSocketConnection).
Вот ничего себе у меня запросы... :-)


 
Суслик ©   (2004-10-06 18:37) [6]


>  потоком-запросом в БД через ADOConnection?

Через один экземпляр ADOCOnnection?

Если да, то ничего не выйдет. ADODB имеет модель appartment.
Т.е. у тебя запросы могут идти из разных потоков, но будут идти последовательно.


 
Кодер ©   (2004-10-06 19:03) [7]

А если я буду использовать ну скажем 5-ть компонент ADOConnection? Как равномерно распределить поток запросов между этими компонентами?


 
Romkin ©   (2004-10-06 19:04) [8]

Суслик ©  (06.10.04 18:37) [6] Не путай народ :)) Скорее, у него модель single threaded. То есть, на каждое соединение - один поток. А вот апартаменты к потокам имеют примерно то же отношение, что и процессы :))) Есть STA, есть MTA...
Кодер ©  (06.10.04 18:34) [5] Да. DCOM - это, как правило, один домен. Вроде бы можно маршалировать, но это нетривиально. Исходники BSS имеются, берешь - и пишешь сервер на их основе :)) Но, сам понимаешь, он будет висеть как сервис, постоянно.
Плюс, возможно использовать это: http://www.overbyte.be/eng/products/midware.html
Но не пробовал. По крайней мере, FreeVCS (JediVCS)построено именно на этом


 
KSergey ©   (2004-10-06 19:55) [9]

Лично у меня не вышло из нескольких потоков обновременно выполнять запросы из разных потоков через один ADOConnection. Так что не знаюкакая там модель, но валилось с ошибкой (всякой, неразумной, так скажем), а не просто "выполнялось последовательно". Это так, к слову.

Ну так и создавать на каждое клиентское подключение ADOConnection, что тут такого? Или я ничего не понял?


 
Суслик ©   (2004-10-07 09:28) [10]


>  [9] KSergey ©   (06.10.04 19:55)

Конечно валилось:))) Т.к. так жестко обращаться можно только с free моделями. Для appartment нужно предпринимать определенные действия. Не помню какие. Если интересно, то посмотри статью на сайте АП - про потоковые модели. Там все есть.


>  [8] Romkin ©   (06.10.04 19:04)


> Скорее, у него модель single threaded

А ты посмотри в реестре. Написано appartment. ТЫ прав, я не очень в этом понимаю. Возможно, что инфа в реестре ничего не говорит. Но в статье на сайте АП про потоковые модели достаточно ясно сказано, что appartmnet при соблюдении определенных правил (честно, не помню каких, но точно НЕ безконтрольный вызов из разных потоков) appartment выполняется имеено так как я сказал.
Я лично этим никогда не пользовался - многопоточный доступ к adodb сам синхронизирую через крит. секцию.

Вот кстати статья
http://podgoretsky.com/ftp/Docs/Delphi/DX/COMmodel.html


 
Суслик ©   (2004-10-07 09:57) [11]

Очень было бы интересно, если бы кто-то хорошо знающий COM и ADODB объяснил, как сделать приложение, запросы в котором могут выполняться в дополнительных потоках с:
1) либо одним ADODBConnection, созданным в главном потоке
2) либо множеством ADODBConnetion - в каждом дополнительном потоке есть свой ADODBConnection, который был создан в этом потоке.

Повторю, что пунт 1 я реализую постредством самостоятельной синхронизации дополнительных потоков через крит. секцию. Я когда-то спрашивал правильно ли так делать. Ответ был таков - не правильно, т.к. противоречит идее COM, но работать будет:)) После этого я ходил по Библио-глобусу - читал книги по COM. Везде было сказаны примерно те же слова.

Вот и интересно было бы знать, как делать правильно.

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


 
Erik1 ©   (2004-10-07 11:39) [12]

Вобщето ничего сложного в этом нет, надо просто делать маршалинг при передаче из одного потока в другой. И количество кода неочень большое, у меня используется класс TInterThreadMarshaler.
У него есть свойство Unknown
procedure TInterThreadMarshaler.SetUnknown(const Value: IUnknown)
begin
 Lock;
 try
   Clear;
   if Assigned(Value) then
     MarshalCOMObject(Value);
 finally
   Unlock;
 end;
end;

function TInterThreadMarshaler.GetUnknown: IUnknown;
begin
 Lock;
 try
   if Assigned(FStream) then
     Result := UnMarshalCOMObject else
     Result := nil;
 finally
   Unlock;
 end;
end;
Для маршалинга используются IStream
CoMarshalInterThreadInterfaceInStream
CoGetInterfaceAndReleaseStream
CoMarshalInterThreadInterfaceInStream


 
Silver Alex ©   (2004-10-07 11:45) [13]

нет смысла в том что бы несколько потоков обращалось к одному ADODBConnection, какая же тут многопоточность если клиенты выстраиваются в очередь чтобы обратиться к нему.А если стартанула транзакция? Правильно в каждом потоке создавать свой ADODBConnection.И из всех вышеперечисленных компонент я бы посоветовал использовать  TSocketConnection ну можно еще CORBA, но это чуть посложнее. Если будут конкретные вопросы может еще чего подскажем.


 
Кодер ©   (2004-10-07 19:59) [14]

А как равномерно распределять входящие по сокетам запросы по потокам, в каждом из которых будет по одному ADOConnection?


 
Суслик ©   (2004-10-07 20:03) [15]


> А как равномерно распределять входящие по сокетам запросы
> по потокам, в каждом из которых будет по одному ADOConnection?

Деражть некий запас созданных потоков. Это лучше чем создавать каждый раз при новом запросе. Использовать семафор для их пробуждения.

Есть книга Рихтера - разработка серверных приложений. Мне кажется, что она тебе очень помогла бы. Набери www.books.ru + Рихтер в поиске. Будет десяток - выберешь нужную. Примерное название я сказал.



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

Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
14-1096716177
ArMellon
2004-10-02 15:22
2004.10.24
Что вы думаете насчет использования TActionList?


14-1096528414
PVOzerski
2004-09-30 11:13
2004.10.24
Еще о USB


1-1097064080
Vikont
2004-10-06 16:01
2004.10.24
Проблема открытия отчета в FastReport


4-1095856824
Vikont
2004-09-22 16:40
2004.10.24
Сканкоды


1-1097305103
Тимур
2004-10-09 10:58
2004.10.24
Как поместить свой popup в WebBrowser(>=Ie5.5)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский