LINUX.ORG.RU

удаление сессии в веб-приложении под Mono 2.8+


0

1

Доброго времени суток. Заранее прошу не кидаться гнилыми помидорами и не разводить холиваров на тему «Mono не нужен», «Это всё проделки сатаны» и тд. Речь здесь пойдёт о платформе Mono, а именно сложилась нехорошая ситуация (при использовании на сервере версии 2.8 и выше): не удаляются сессии (у которых истёк таймаут) до тех пор, пока есть хотя бы одна активная сесиия. т.е., допустим, на сервере висит 2 неактивных сесии и истёкшим таймаутом и 1 активная. по идее они должны были удалиться из памяти, вызвать событие Session_End из Global (используется режим «InProc») и всё было бы прекрасно (а так и было ещё в версии 2.6.7). Но, эти две неактивные сессии не удаляются до тех пор, пока не истечёт таймаут последней активной. т.е. они удалятся только все вместе одновременно.

соответственно, при активном трафике и даже, в принципе, небольшой посещаемости веб-ресурса - сессии накапливаются мёртвым грузом, потребляемая озу вырастает по экспоненте, сервер падает замертво до очередной перезагрузки.

пробовал собирать Mono из исходников, при этом заменяя файл SessionInProcHandler.cs (./mcs/class/System.Web/System.Web.SessionState_2.0/SessionInProcHandler.cs) на версию из Mono 2.6.7 - не помогает.

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

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



Последнее исправление: v01 (всего исправлений: 1)
Ответ на: комментарий от drBatty

пробовал писать в отдельном потоке таймер, который в фоновом режиме вызывает Session.Abandon() у сессий с истекшим таймаутом. но и это не сработало. пока есть хоть 1 активный клиент - все сессии как висели так и висят.

v01
() автор топика
Ответ на: комментарий от drBatty

думал сделать так. но при хранении «во вне» становится невозможным использование события Session_End, использование которого необходимо в приложении (а как иначе отследить и обработать завершение сесии в asp.net - не знаю).

плюс надо в сессии хранить дерево TreeView для скорости загрузки страницы. можно, конечно, сделать загрузку дерева каждый при открытии страницы, но тогда скорость падает просто до ужаса (учитывая, что в дереве овер 1000 элементов, которые рекурсивно вычитываются из базы данных).

v01
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.