вторник, 22 апреля 2008 г.

SPWeb.Dispose и SPSite.Dispose

Sharepoint от стека лежащих под ним .net-технологий отличает интересная особенность:
разработчики объектной модели решили не слишком заморачиваться с написанием удобных классов и возложили обязанности по
освобождению памяти
, выделяемой глубоко в недрах Microsoft.Sharepoint.dll native-кодом, на прикладного разработчика.

Если вы используете объектную модель Sharepoint, после использования объектов классов SPWeb и SPSite вы обязаны вызывать у них Dispose-методы, иначе приложение будет терять память.

SPSite oSPSite =newSPSite();
...
oSPSite.Dispose();

Несоблюдение этого правила в большинстве случаев приведет к регулярному перезапуску IIS Worker processes, что негативно сказывается на производительности портала.
Если излишне полагаться на объектную модель, возможно и такое: недавно я видел как метод, выполняющий большую, по сути транзакционную операцию над данными на узле Sharepoint, падает с OutOfMemoryException. Причина - частое создание SPWeb-объектов без освобождения ресурсов.

Основные случаи освобождения памяти описаны в многостраничном Best Practices: Using Disposable Windows SharePoint Services Objects, но информации в нем недостаточно.

Roger Lamb описал ещё 16 ситуаций, в которых безобидные вызовы вроде SPList.BreakRoleInheritance, приводят к утечке памяти.

P.S. статью Roger Lamb я увидел в блоге Serge Luca

Комментариев нет: