2009-03-10 2 views
11

Запуск проблемы, когда JSF заполняет наши сеансы. На днях у нас был сбой системы. Отправил кучу в IBM для обзора и выяснил, что у нас были сеансы размером до 50 миллионов. Они нашли компоненты JSF в сеансе и некоторые очень большие.JSF Tuning

Итак, есть ли какая-либо настройка, которая может быть выполнена? Элементы конфигурации, на которые нужно смотреть? Или в другом направлении.

Наша система построена с использованием JSF и Spring для уровня представления, задний конец - EJB, Spring и Hibernate, все работает на WebSphere 6.1.

ответ

22

JSF - полезная технология, но вы можете, конечно, повесить себя на нее.

Похоже, вы либо накапливаете размер состояния представления (путем установки больших значений на компонентах), либо утечки ссылок на компоненты в другое состояние сеанса (что было бы плохо). Еще одним потенциальным виновником будет чрезмерно большой взгляд (я видел, как легкость, с которой люди могут создавать деревья UI, ведет к очень большим графикам управления со всеми таблицами данных). Я знаю, что IBM предоставляет расширенные текстовые и электронные таблицы - я не могу прокомментировать, какое влияние их использование будет иметь на размер штата.

Низкие висячие фрукты - это проверка управляемых компонентов, сконфигурированных для области сеанса в faces-config.xml.

JSF сохраняет две вещи между запросами:

  • вид (все элементы управления на странице)
  • состояние представления (состояние управления)

Они разделены, потому что некоторые элементы управления, такие как дети таблицы данных, могут иметь несколько состояний (по одному для каждой строки). Состояние может быть сохранено либо в скрытом поле формы (которое, если оно не зашифровано, может быть большой угрозой безопасности) или в сеансе. Чтобы разместить несколько окон браузера, совместно использующих один и тот же сеанс (а в некоторых реализациях - поддержка кнопки «Назад»), сохраняются несколько представлений.

  • Должна быть опция конфигурации для установки количества состояний представления, которые приложение будет хранить в сеансе для данного пользователя в любой момент времени.
  • Вы можете измерить размер состояния просмотра, предоставив StateManager, который измеряет размер сохраненного вида/состояния (сконфигурируйте StateManager в faces-config.xml с открытым конструктором, который принимает StateManager - см. PDF-файлы JSF spec для более подробной информации; состояние сериализуемо, и вы можете проверить его размер, сбросив его в поток).

Большинство IDS-приложений JSF поддерживают бобы. Было бы возможно, что при использовании области сеансового соединения удерживать состояние дольше, чем вы хотите, создавая нагрузку на сеанс. Поскольку на одной странице есть один бэк-файл, тем больше страниц у вас есть, тем больше проблема будет. Проверьте свой faces-config.xml, чтобы узнать, является ли это потенциальным источником проблем.

Что-то еще, что вы могли бы сделать, это настроить HttpSessionAttributeListener на ваш web.xml. Вы можете получить stack trace, чтобы помочь выявить проблемные области в вашем приложении.

3

Это вторая система, о которой я слышал, которая умерла из-за JSF и создания чрезмерного объекта. Другой также использовал Spring и Hibernate в задней части. Профилирование с помощью OptimizeIt показало, что ответ на бэкэнд был порядка миллисекунд для всех запросов, но вы можете снова отобразить браузер с секундомером, потому что это заняло так много времени - от 30 секунд до нескольких минут. Память, потребляемая клиентом, была смешной.

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

Но если два момента создают тренд, я бы сказал, что JSF может быть смертельно испорчен. Лично я полностью избегаю этого.

Почему бы не попробовать передний конец весны и посмотреть, помогает ли это? Если вы будете следовать идиоме Spring, это будет относительно простой вопрос о замене JSF на JSPL-JSP и контроллеры Spring.

+0

только личное мнение, но я думаю, что недостаток лежит на IBM, а также на их реализацию JSF. Я не могу оправдать свои чувства :) – guyumu

+0

Тот, который я видел, не использовал Sun JVM и реализацию Apache JSF. Apache - это IBM, поэтому я не могу сказать, как они отличаются друг от друга. Я думаю, что это модель JSF - мне кажется очень тяжелой. – duffymo

3

Я работал над проектом JSF и обнаружил, что у нас была ошибка, когда мы добавляли несколько элементов JSF h: form. Результирующая копия всего окна просмотра включается в каждую форму. Сокращение до 1 формы на страницу сбрило страницы от ~ 2M до ~ 300K.

1

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

Вы можете попробовать: MyFaces Orchestra. Это библиотека, которая предоставляет область разговора, поэтому, как только пользователь завершит работу с определенным набором компонентов, они будут удалены из сеанса.

Я понимаю, что Spring WebFlow имеет схожие функции, но я на самом деле не смотрел его!

1

JSF хранит представления в сеансе, чтобы поддерживать его богатую компонентную архитектуру (необходимо сохранить состояние просмотра) и может заполнить кучу, если она не используется должным образом. Если у вас нет больших рабочих потоков, всегда используйте небольшое количество просмотров за сеанс. Также избегайте максимально возможного сохранения бэби-бинов в сеансе. Используйте специальный тег, чтобы сделать объект данных только для следующего цикла запроса. Мы также можем использовать Spring Web Flow с JSF, который вводит область представления и область потока, если у нас есть длинные рабочие процессы в приложении, чтобы уменьшить количество просмотров, настроенных в сеансе. JSF можно использовать для создания богатого пользовательского интерфейса, что помогает создавать Web-приложения, похожие на настольные приложения. Выделите конкретную кучу для структуры JSF для выполнения своей работы. Но эффективно используйте память в стороне приложения и убедитесь, что утечки памяти нет. Все утечки памяти необходимо исследовать и исправлять во время разработки. В аутах используется профилировщик, чтобы найти утечки памяти и узкие места производительности, которые существуют в приложении.

Матем.

1

Если вы используете MyFaces < 1.1.6, существует огромная утечка памяти, так как она кэширует старые сериализованные представления в сеансе, фактически никогда не позволяя им выпускаться, чтобы они могли быть собраны мусором. У меня была серьезная проблема с этим, и у меня было 50 Мб сессий. Быстрое обновление MyFaces устранило проблему без проблем.

1

Настроить сеанс persistense для базы данных, и он будет использовать наименее используемый алгоритм для толкания наименее используемых сеансов из памяти. Он имеет высокую производительность (при правильной настройке) и поможет вам в конкретике и быстроте.

1

Немного старой темы, но натолкнулся на это недавно. Часто состояние просмотра и просмотра сохраняется (как упоминалось ранее) и заполняет сеанс, чтобы кнопка «Назад» работала. Есть параметры для сортировки этого в дескрипторах развертывания (web.xml), которые необходимо установить.

Для нескольких экземпляров определенных библиотек может потребоваться несколько параметров, например при использовании MyFaces и JSF RI. По умолчанию они могут быть установлены на некоторые довольно высокие значения (соответственно 20 и 16). Это означает, что вы можете использовать в 20 раз больше пространства, в котором вы должны быть (части?) Сеанса.

1

настройки JSF советы по производственной среде:
- Использование изображений, CSS и ресурсы JavaScript должно быть сделано с помощью стандартных HTML-тегов (img,link,script) не на стороне сервера, и убедитесь, что установлен #{request.contextPath} перед URL, чтобы избежать относительных путей вопросы.
- Кэш статические разделы страницы (menu,header,footer) с помощью omnifaces cache
- Установить переменную refresh-period -1
- набор project-stage для производства
- проверить ваш код фильтры если

Кроме того, проверьте мою статью «Java Server Faces in Real-Life Applications» на DZone, он даст вам полную картину о JSF в области разработки, тестирования и производства.

+0

Спасибо Shaz! , обновлено. –