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

Вниз

Организация пула соединений   Найти похожие ветки 

 
Ega23 ©   (2008-06-18 10:41) [0]

Ну вот и я дошёл наконец-то до многозвенки и, похоже, требуется сей зверь писать. Кто занимался (читал, видел, слышал) чем-то похожим - посоветуйте, что почитать на эту тему?
Сама задача для меня крайне интересная, но как и с какого боку к ней подступиться - пока не ясно. Сижу, гуглю.
В общем, буду признателен за любые наводки по этому вопросу, а за толковую статью - даже пиво проставлю.  :)


 
Palladin ©   (2008-06-18 10:51) [1]

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


 
Palladin ©   (2008-06-18 10:52) [2]

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


 
DrPass ©   (2008-06-18 10:58) [3]


> Кто занимался (читал, видел, слышал) чем-то похожим - посоветуйте,
>  что почитать на эту тему?

А что там читать? Сел в кресле, подумал и написал. Пул соединений - это просто массив этих самый соединений с функциями "запросить соединение" "отдать соединение". Как правило, потокобезопасный и, вероятно, со сборщиком мусора


 
Поросенок Винни-Пух ©   (2008-06-18 10:59) [4]

зачем пул?
один клиент - один коннект к данным


 
Ega23 ©   (2008-06-18 11:07) [5]


> один клиент - один коннект к данным
>


А когда 1000 клиентов? 1000 коннектов?


 
Поросенок Винни-Пух ©   (2008-06-18 11:09) [6]

прям так сразу и тысяча.
в один момент.


 
Ega23 ©   (2008-06-18 11:10) [7]


> прям так сразу и тысяча.
> в один момент.


Ну по прикидкам тысяча - аккурат средняя нагрузка. Пиковая - 2000.


 
Romkin ©   (2008-06-18 11:10) [8]

Обычно да :)
Пул соединений применяется обычно для stateless клиентов, которые присоединяются к серверу, берут данные и сразу отключаются. Потом снова. Коннект обычно долгий (инициализация объектов, соединение с БД и тд), поэтому держат соединения про запас.
Но если есть возможность держать соединение постоянно - почему нет?


 
Поросенок Винни-Пух ©   (2008-06-18 11:12) [9]

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


 
Поросенок Винни-Пух ©   (2008-06-18 11:15) [10]

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


 
Ega23 ©   (2008-06-18 11:21) [11]


> если будет пул на сто коннектов для тысячи клиентов это
> примерно равносильно ограничению числа коннектов к фронту.
>
> пока в пуле не освободится сессия с данными сто первый клиент
> курит


Сессий - 1000. Но это не значит, что они все разом данные тянут.


 
Поросенок Винни-Пух ©   (2008-06-18 11:22) [12]

не так чтобы авторизоваться сто первому нежен свободный коннект к бд
откуда там тысяче сессий взятся?


 
Ega23 ©   (2008-06-18 11:29) [13]


> не так чтобы авторизоваться сто первому нежен свободный
> коннект к бд


Ну и нормально. Есть свободный - взял его, попользовался и отдал. Нет - ну либо подождал, либо создал новый.

Меня больше тут потоки и потокозащищённость интересуют, т.к. с этим делом толком не работал.


 
Поросенок Винни-Пух ©   (2008-06-18 11:29) [14]

в общем если хочется именно пул, то можно и пул.
как сделано у меня:
-пришел клиент, я определил, что он "новый"
-создаю ему модуль данных для коннекта с бд, и отдаю сгенеренный "куки" (guid)
- выполняю чо он хочет, отдаю данные, закрываю http сессию
- через минуту приходит он же ("с кукой").
- ищу его модуль данных и если его уже нет, создаю новый и прошу авторизоваться.
- если модуль еще жив, просто выполняю запрос и отдаю данные.

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


 
DrPass ©   (2008-06-18 11:32) [15]


> Поросенок Винни-Пух ©   (18.06.08 11:12) [9]
> если будет пул на сто коннектов для тысячи клиентов это
> примерно равносильно ограничению числа коннектов к фронту.
>

Для того пул и делается - чтобы разумно распределять нагрузку на СУБД


 
Поросенок Винни-Пух ©   (2008-06-18 11:34) [16]

Для того пул и делается - чтобы разумно распределять нагрузку на СУБД

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


 
Ega23 ©   (2008-06-18 11:35) [17]


> так я и говорю, ограничить число сессий с сервером приложений
> - будет тоже самое.
>


А вот этого уже быть не должно. Ибо СП кроме коннекта с БД ещё массу всякого разного делает.


 
Поросенок Винни-Пух ©   (2008-06-18 11:37) [18]

Удалено модератором


 
KSergey ©   (2008-06-18 11:41) [19]

> Поросенок Винни-Пух ©   (18.06.08 11:29) [14]
> как сделано у меня:

В схеме не описано когда исчезает модуль данных. Можно уточнить?

И еще. Получается, что кол-во коннектов к БД всегда равно кол-ву "активных" пользователей (активный он до тех пор, по сути, пока его не попросили заново регистрироваться). Это я правильно понял?


 
Ega23 ©   (2008-06-18 11:43) [20]

А, я понял о чём ты.
Сервер в базу ходит под одной и той же учёткой, авторизация пользователя происходит на СП, а не на сервере БД.


 
Поросенок Винни-Пух ©   (2008-06-18 11:44) [21]

Модули данных умирают по завершению таймаута (клиент ассоциированный с модулем ничего не делал в течение X минут)

Число коннектов всегда не меньше количества активных пользователей.
У клиента трансортом http с Connection : Close


 
Поросенок Винни-Пух ©   (2008-06-18 11:48) [22]

Сервер в базу ходит под одной и той же учёткой

Да. Просто клиенты это не инсайдеры. Для них нет никаких учетных записей в AD предприятия.


 
KSergey ©   (2008-06-18 11:53) [23]

> Поросенок Винни-Пух ©   (18.06.08 11:44) [21]
> Число коннектов всегда не меньше количества активных пользователей.

Коннектов к БД, верно?
Мдя, дороговастенько.... Хотя, конечно, от задач и потребностей зависит.


 
Поросенок Винни-Пух ©   (2008-06-18 11:55) [24]

зависит от приоритетов.
кто-то сервер бережет чтобы не устал, кто-то считает, что задержка в обслуживании это недопустимо.


 
Ломброзо ©   (2008-06-18 12:36) [25]

> Ega23 [1]

Тут всё просто.

Предположим, у нас есть СУБД, сервер приложений (СП) и клиент, причём СУБД и СП общаются по OleDB/ADO/ADO.NET, а способ общения СП и клиента изучим ниже.

Итак, если мы используем OleDB драйвер (a ADO - это всего лишь тонкая надстройка над OLE DB), то поддержка Connection Pooling в свежих версиях драйверов реализована почти для всех СУБД, а включение этой фичи задаётся соотв. параметром строки соединения (см. MSDN, например http://msdn.microsoft.com/en-us/library/ms254502.aspx). Парадигма использования соединений такова: открыть соединение, выполнить запрос, и как можно быстрее закрыть. После закрытия соединение автоматически возвращается в пул:


Set pConn = CreateObject("ADODB.Connection")
pConnConnectionString = "..."
pConn.Open

Set pRs = pConn.Execute("select * from test")
pConn.Close


Далее. От имени какой учётной записи работать с базой? Обычно, действительно, СП настраивают таким образом, что он работает с БД от имени одной-единственной учётной записи, поскольку в том случае, если с одной машины к СУБД будет установлено два подключения, у которых будут отличаться строки соединения, то будет задействован дополнительный  физический ресурс (TCP-соединение, PIPE и др.), что увеличивает нагрузку на сервер. При таком подходе несколько сложнее рулить привилегиями, поэтому в данной архитектуре функции аутентификации и авторизации обычно выносят на сервер приложений.

Ну и наконец, как наладить общение клиента и СП? Тут вариантов море, и сейчас модно использовать архитектуру SOA: на СП разворачивается пул сервисов (веб-сервисов, WCF-сервисов, Remoting-сервисов, COM+-сервисов), которые выдают по запросу клиента некий пакет данных (XML/SOAP-документ, сериализованный граф объектов (Data Transfer Objects) и т.д.) и забывают о нём. Клиент работает с полученным пакетом, делает в нём изменения и шлёт изменённый пакет на сервер приложений сервису. Сервис распознает изменения и выполняет обновления в базе данных. Вот и всё.

В MSDN куча информации по архитектуре многозвенок.


 
Empleado ©   (2008-06-18 16:27) [26]


> что почитать на эту тему?

1) "Design Considerations for MIDAS/DataSnap" by Vino Rodrigues

2) "A Technical View of Borland MIDAS" 1997 by Charlie Calvert
http://info.borland.com/midas/papers/

3) http://dn.codegear.com/delphi/distcomp/midas

4) "MIDAS. Практическое применение" Роман Игнатьев RSDN Magazine #2


 
Romkin ©   (2008-06-18 16:32) [27]

Многозвенка - не обязательно MIDAS.


 
Empleado ©   (2008-06-18 16:39) [28]


> Romkin ©   (18.06.08 16:32) [27]

Я только Мидас использовал, поэтому и статьи.


 
Romkin ©   (2008-06-18 17:03) [29]

4. http://rsdn.ru/article/db/midas.xml



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

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

Наверх




Память: 0.55 MB
Время: 0.022 c
2-1215040775
Si13
2008-07-03 03:19
2008.08.03
VSL Form, проблемы с открытием


2-1214904699
Skary
2008-07-01 13:31
2008.08.03
Звук


4-1193628432
031178
2007-10-29 06:27
2008.08.03
Как программно поменять частоту обновления экрана


15-1213897933
savyhinst
2008-06-19 21:52
2008.08.03
Приходите на конференцию


2-1215254494
RealSwift
2008-07-05 14:41
2008.08.03
Перевести запрос к MDB из VB в DELPHI