Dicas Performance - JSF 2.2 + PrimeFaces 5.2 + Hibernate 4.3 + WildFly 8.2

0 respostas
aboult

Bom dia,

Estou iniciando no desenvolvimento com JSF + JPA pois surgiu a necessidade de desenvolver um ERP em Java Web. Tenho experiência com desenvolvimento Forms (C#/VB.NET/VB6), Android e Flex.

Venho lendo a documentação tanto do Hibernate e do PrimeFaces, mas sinto às vezes um certo problema em termos de performance.

Também tenho tido dúvidas e problemas com relação a qual seria a configuração correta do WildFly nesse estilo de projeto que seria um ERP onde vários usuários estariam "pendurados" no sistema gravando, consultando e etc. Pois tive problemas com o Pool de conexões.

Gostaria de saber se alguém teria dicas para ajudar e no que devo focar para desenvolver um projeto deste tamanho com alta performance. Talvez alguma documentação mais focada e técnicas para analise de performance e dicas em geral.

Abaixo um exemplo de como venho modelando uma tela do sistema, talvez esteja fazendo algo de errado:

Entidade Embalagem:
@Entity
@Table(name = "embalagens")
@Data
@EqualsAndHashCode(callSuper = false)
public class Embalagem extends AppModel implements Serializable {
    
    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "embalagemSeq")
    @SequenceGenerator(name = "embalagemSeq", sequenceName = "embalagens_id_seq", allocationSize = 1)
    private Integer id;
    
    @Column(name = "descricao", nullable = false, length = 60)
    private String descricao;
    
    @Column(name = "volume", precision = 12, scale = 3)
    private BigDecimal volume;
    
}
Controller:
@Named("embalagensController")
@ViewScoped
public class EmbalagensController extends AppController implements Serializable {
    
    @Getter private List<Embalagem> embalagens;
    
    @Getter @Setter private Embalagem embalagem;
    
    @PostConstruct
    public void fetchEmbalagens() {
        embalagens = getEntityManager().createQuery(
                "SELECT e FROM Embalagem e ORDER BY e.descricao",
                Embalagem.class).getResultList();
    }
    
    public void editEmbalagem(Embalagem embalagem) {
        this.embalagem = embalagem;
    }
    
    @Transactional(rollbackOn = { Exception.class })
    public void removeEmbalagem(Embalagem embalagem) {
        removeDetached(getEntityManager(), embalagem);
        embalagens.remove(embalagem);
    }
    
    public void newEmbalagem() {
        embalagem = new Embalagem();
    }
    
    @Transactional(rollbackOn = { Exception.class })
    public void postEmbalagem() {
        getEntityManager().merge(embalagem);
        fetchEmbalagens();
    }
    
    public void cancelEmbalagem() {
        embalagem = null;
    }
}
E a View:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:body>
        <ui:composition template="/templates/rio-layout/template.xhtml">

            <ui:define name="title">Embalagens</ui:define>

            <ui:define name="content">
                <h:form id="embalagensForm">
                    <p:growl id="embalagensMessages" showDetail="false" />

                    <p:dataTable id="embalagensTable"
                                 value="#{embalagensController.embalagens}" var="e">

                        <f:facet name="header">
                            <p:commandButton icon="fa fa-plus-circle" actionListener="#{embalagensController.newEmbalagem}" update=":embalagemDialog"
                                             oncomplete="PF('embalagemDialog').show();" />
                        </f:facet>

                        <p:column headerText="Código" style="text-align: center; width: 80px;">
                            <h:outputText value="#{e.id}" />
                        </p:column>

                        <p:column headerText="Descrição">
                            <h:outputText value="#{e.descricao}" />
                        </p:column>
                        
                        <p:column headerText="Volume (m³)" style="text-align: center; width: 80px;">
                            <h:outputText value="#{e.volume}">
                                <f:convertNumber pattern=",##0.000" locale="pt_BR" />
                            </h:outputText>
                        </p:column>

                        <p:column style="text-align: center; width: 16px;">
                            <p:commandLink action="#{embalagensController.editEmbalagem(e)}" update=":embalagemDialog"
                                           oncomplete="PF('embalagemDialog').show();">
                                <i class="fa fa-edit"></i>
                            </p:commandLink>
                        </p:column>

                        <p:column style="text-align: center; width: 16px;">
                            <p:commandLink action="#{embalagensController.removeEmbalagem(e)}" update="embalagensTable">
                                <p:confirm header="Excluir" message="Confirma excluir embalagem?" icon="fa fa-question-circle" />
                                <i class="fa fa-trash-o"></i>
                            </p:commandLink>
                        </p:column>

                    </p:dataTable>
                </h:form>
                
                <p:dialog header="Embalagem" id="embalagemDialog" widgetVar="embalagemDialog" modal="true" resizable="false">
                    <h:form id="embalagemForm">
                        <p:growl id="embalagemMessages" showDetail="false" />
                        
                        <p:panelGrid columns="2" styleClass="transparentGrid">
                            <p:outputLabel for="idText" value="Código:" rendered="#{embalagensController.embalagem.id ne null}" />
                            <p:inputText id="idText" value="#{embalagensController.embalagem.id}" size="5" readonly="true" rendered="#{embalagensController.embalagem.id ne null}" />

                            <p:outputLabel for="descricaoText" value="Descrição:" />
                            <p:inputText id="descricaoText" value="#{embalagensController.embalagem.descricao}" size="20" required="true" requiredMessage="Descrição da embalagem não informada." />
                            
                            <p:outputLabel for="volumeText" value="Volume (m³):" />
                            <p:inputText id="volumeText" value="#{embalagensController.embalagem.volume}" size="20">
                                <f:convertNumber pattern=",##0.000" locale="pt_BR" />
                            </p:inputText>

                            <f:facet name="footer">
                                <p:commandButton id="okButton" icon="fa fa-check" value="OK"
                                                 action="#{embalagensController.postEmbalagem}" update="embalagemMessages,:embalagensForm:embalagensTable"
                                                 oncomplete="handleDialogRequest(xhr, status, args, PF('embalagemDialog'));" />

                                <p:commandButton id="cancelarButton" icon="fa fa-close" value="Cancelar" immediate="true"
                                                 action="#{embalagensController.cancelEmbalagem}"
                                                 oncomplete="PF('embalagemDialog').hide();" />
                            </f:facet>
                        </p:panelGrid>
                        
                        <p:defaultCommand target="okButton" />
                    </h:form>
                </p:dialog>

            </ui:define>

        </ui:composition>
    </h:body>
</html>
Criado 1 de setembro de 2015
Respostas 0
Participantes 1