![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Corba ест память!!!
comwad © (2002-02-11 15:14:00)Здравствуйте!
Сервер приложений Corba запущен на компьютере, где находится MS-SQL сервер.
При подсоединении очередного тонкого клиента растет память Сервера приложений и несоизмеримо растет память sqlservr.exe. Если клиент некорректно «отвалится»,то памяти Сервера приложений не уменьшается, а при новом соединении увеличивается. В итоге надо перезагружать весь компьютер с серверами , спасаясь от переполнения виртуальной памяти.
Что делать , где прокол?
Спасибо.
nikols (2002-02-11 17:05:00) [1]Пр написании POA ориентированного сервера CORBA можно при создании серванта задать время, по истечении которого, если не было к нему обращения - он уничтожается либо деактивируется. Если соединение создано в серванте, то и его можно уничтожить... Но это POA, его пока в Delphi нет...
Олег Лаукарт (2002-02-11 16:56:00) [2]Если я правильно понимаю, то сервер приложений ваш собственный, значит проблема в нем - он не контролирует освобождение памяти при обрыве связи с клиентом. Если каждому клиенту выдается ссылка на персональный объект, тоесть сервер является фабрикой корба объектов, то на него ложится задача вовремя убить этот объект. Я знаю два способа, но идеального варианта нет, в каждом свои проблемы. Оба расчитаны на то, что сервер (фабрика), при обнаружении потери связи с клиентом удаляет объект. Это может также произойти, если клиент "долго" (в понимании сервера о контроле нагрузки на систему) не использует объект. Тогда его тоже можно удалить, а клиент если ему всетаки надо, может подключится еще раз.
Метод 1.Клиент при подключении оставляет серверу CallBack интерфейс с единственным методом для проверки его активности void IsActive (); это должен быть пустой метод и его задача протестировать связь. Если при его вызове возникает ошибка - клиент мертв. Сервер периодически вызывает у всех клиентов этот метод и удаляет "трупики".
Метод 2.Для каждого объекта сервер хранит время предыдущего использования, и если интервал превышает допустимый, то принимаем меры. Для оптимизации можно держать список объектов с временем и при использовании объекта перемещать его выше (в начало). Периодически надо проверять хвост списка и удалять если надо.
На самом деле можно совмещать оба метода.
nikols (2002-02-11 16:56:00) [3]При соединении с сервером создается обьект Session. Довольно ресурсоемкий обьект. То, что при его создании растет память - естественно. Мое мнение - при некорректном завершении работы надо предусмотреть способ уничтожения соединения - например отслеживать время с последнего обращения клиента к соединению и при превышении предела уничтожать, либо еще как. Это задача программиста.