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

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.

[b]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.[/b]

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:

[code]@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;

}[/code]

Controller:

[code]@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;
}

}[/code]

E a View:

[code]

        <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>
[/code]