Я работаю над WebApp, используя JSF 2.2 + Primefaces... проект быстро растет, и первый тест производительности был очень плохим (из-за моих плохих знаний о JSF LifeCylce в сочетании с не-функциональными требованиями - т.е. полностью ajax-сайт), то мы могли бы немного улучшить, но результаты все же не так ожидаемы. (Мы имеем время 300 ~ 1500 мс в зависимости от действия, идея состоит в том, чтобы иметь производительность около 500 мс, давать или брать). В основном фаза Восстановить вид и Render Response являются потребителями времени (на других фазах, потраченное время бесполезно). Для некоторых действий Invoke Aplication также требуется время (из-за вызовов БД).
После прочтения большого количества статей в Интернете было много замечательных советов, которые нужно учитывать (многие из них, конечно, из stackoverflow), например:
- Улучшение запросов БД
мы имеем несколько сложных, которые выполняются с двумя запросами Критерий Hibernate, поэтому мы работаем здесь. (возможно, использовать чистые SQL-запросы, а на сложных - подзапросы?)
- Никогда не определяйте бизнес-логику на Bean getters
Получил это!
- Установка соответствующих областей Bean и сохранение на них не более чем необходимого материала
У нас есть полный сайт ajax, поэтому View Scoped - это почти как Session Scoped для нас, мы используем SessionBeans как своего рода "Cache" для хранения ключевых данных, которые мы не хотим получать из DB каждый раз + определить логику бизнеса здесь.
- Выбор правильного метода сохранения состояния JSF-Client Vs Server
Для этого я должен исследовать еще немного, проверить возможности со своими плюсами и минусами, а затем проверить производительность на каждом из них.
До сих пор очень ясно, теперь некоторые дополнительные советы, на которых у меня есть некоторые сомнения.
- Использовать ванильный HTML как можно больше и желательно использовать h: теги, а не p: теги
Простой HTML ясен и имеет смысл, теперь между h: и p: насколько он достоин? Например.
<p:commandButton value="Value"
styleClass="class"
actionListener="#{myBean.doStuff()}"
ajax="true" process="@form" update="@form"
onsuccess="jsFunction()" />
против
<h:commandButton value="Value"
styleClass="class"
actionListener="#{myBean.doStuff()}" >
<f:ajax execute="@form" render="@form" event="onclick" />
</h:commandButton>
или
<ui:fragment... vs <p:fragment...
или
<p:outputLabel value="#{myBean.value}" rendered="#{myBean.shouldRender}" />
против
<ui:fragment rendered="#{myBean.shouldRender}">
<label>#{myBean.value}</label>
</ui:fragment>
Я использую сочетание Primeface с тегами Jsf и некоторым простым HTML здесь и там какое-то время (в основном PF из-за их компонентов). Теперь, когда простой HTML всегда будет быстрее, но между JSF и другой Рамки? Если я пойду за этим, его изменение займет много времени, и мне бы не хотелось, чтобы результат знал, что он не имеет никакого отношения к разнице.
- Теги пользовательских тегов против составных компонентов
Я думаю здесь ключ. Все еще есть некоторые сомнения относительно их различий, при реализации обоих, CC довольно просты и гибки в использовании, но имеют тот недостаток, что они полностью включены в ViewTree, и JSF повторно генерирует для каждого запроса (если я не ошибаюсь), в то время как пользовательские теги кажутся немного более сложными в использовании (не так много), но имеет то преимущество, что только то, что фактически отображается, включено в ViewTree и не более того, что делает RESTORE VIEW менее трудоемким. У нас есть несколько составных компонентов и никаких тегов Facelets, поэтому здесь это будет большая часть работы. Я до сих пор не нашел хорошей статьи, объясняющей различия в них, когда нужно использовать, а когда другой (прочитал, что для входов сообщения используют TAGS и для более сложных вещей CC). Если идея состоит в том, чтобы предпочесть теги против CC, что будет в случае, когда у меня не будет выбора, а не с помощью CC? Можно ли использовать собственные теги внутри CC, чтобы сделать их более легкими для JSF для их обработки?
Я собираюсь попасть в путешествие по модификации проекта дыр, чтобы получить лучшую производительность, которая займет у меня кучу дней, идея состоит в том, чтобы на этот раз получить лучшие результаты; поэтому каждый совет, советы и предложения очень приветствуются! Спасибо за ваше время, ребята!