JSF - Otimizar desempenho

17 respostas
llucas

Pessoal eu preciso urgente de umas dicas para melhorar o desempenho da minha aplicação jsf
Eu detectei uns problemas simples

Quando eu inicio a aplicação ela funciona normalmente, apos algum tempo navegando nas páginas e submetendo formulários o consumo de memória vai aumentando aos poucos até chegar a um estado inaceitável.

Por exemplo, se o usuário abrir uma página com muitas informações e atualizar ela várias vezes (Segurando o botão F5) o consumo de memória do servidor sobe muito. É inaceltável um usuário comum ter poder elevar o consumo de memória dessa maneira.

Alguém sabe algumas dicas pra eu melhorar esses problemas de consumo de memória e CPU?
Tem alguma anotação do web xml que limite o numero de requisições de um usuário ou coisa parecida?

17 Respostas

Hebert_Coelho

Por curiosidade… Seus MBs estão como SessionScoped?

llucas

Todos os beans tão @RequestScoped exceto 1 ou 2 porque são realmente necessários
E eu tenho costume de colocar implements Serializable nos meus bean, isso é um problema?

Hebert_Coelho

llucas:
Todos os beans tão @RequestScoped exceto 1 ou 2 porque são realmente necessários
E eu tenho costume de colocar implements Serializable nos meus bean, isso é um problema?
Creio que não. Esse problema acontece em todas as telas? Ou nas telas que envolvem SessionScoped?

Uma vez que são RequestScoped nenhuma memória deveria permanecer alocada.

llucas

Qualquer tela que carrega a memória sobe um pouquinho (creio que seja normal)
Dependendo da quantidade de dados que a tela tiver a memória sobe mais (talvez seja normal também)
O problema é que a memória vai sempre subindo, mas nunca desce… (isso já não devia acontecer)
Eu imaginei que quando o sistema tivesse em uso a memoria subiria
Quando não recebesse acesso o consumo de memória iria diminuir, mas isso não acontece

Hebert_Coelho

Veja se seus MBs de sessão não estão sendo chamados a todo momento e armazenando informação. Isso deveria acontecer não viu! O.o

llucas

Tirei todos os sessionbean pra testar e da no mesmo

Hebert_Coelho

llucas:
Tirei todos os sessionbean pra testar e da no mesmo
Você está utilizando EJB? Algum @Statefull?

llucas

Não que eu saiba =/

Olha só eu notei que a memória sobe muito quando é carregada uma página com muitas informações do banco de dados
Tipo… Tem página com muito informação mesmo.

Hebert_Coelho

llucas:
Não que eu saiba =/

Olha só eu notei que a memória sobe muito quando é carregada uma página com muitas informações do banco de dados
Tipo… Tem página com muito informação mesmo.

É cara, ta estranho viu. Pode ser cache do hibernate. Caso você esteja utilizando né?

llucas

Eu num configurei nada relacionado ao cache não.
Como é? Eu tenho que desativar é?

Hebert_Coelho

Aqui tem algo: http://stackoverflow.com/questions/3827704/how-to-disable-hibernate-caching

Não sei c é esse o seu problema.

Outra coisa que me veio a mente, você tem fechado todas as conexões abertas?

llucas

Acho que pode ser esse negócio de fechar conexões do hibernate então
Como eu faço isso?
Na verdade eu criei uma conexão e eu achei que era única

Eu tenho o hibernate util com a função getSession

Quando eu instancio um Dao ele chama esse getSession e faz operações tipo

@Override public void salvar(DaoClass daoClass) throws DAOException { try { transaction.begin(); session.save(daoClass); transaction.commit(); } catch (Exception exc) { throw new DAOException(exc); } }
se eu fechar a conexão depois do commint() eu acho que vai dar LazyInitializationException quando eu chamar uma lista
Como eu faço pra abrir uma conexão fazer a operação e não ter problema?

Uma vez eu tentei usar um filtro OpenSessionInView mas não entendi muito bem como funcionava e parei

Hebert_Coelho

Cara, eu acho que pode ser isso viu.

Dá uma olhada aqui oh: Quatro soluções para LazyInitializationException.

llucas

Eu achei esse post no blog da caelum
Eu que meu problema pode vir desse conjunto de coisas que ele fala aí.


Por enquanto eu vou tentar implementar o Open session in view pras sessões do hibernate e também descobrir como e quando usar esse StatelessSession
Eu também tinha dúvida se minhas configurações do c3p0 poderiama influenciar nisso. Eu fiz assim:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">1000</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">100</property>

bobfroes

Rapaz, pode ser isso mesmo,

Me lembro quando estava estudando sobre EAGER e LAZY. Precisei fazer um consulta do objeto "estado" que tem dentro ums lista de cidades, e que em cada cidade tem uma lista de bairros...pense numa lentidâo?! Estavam todos marcados como EAGER.

Agora, imagina se fosse instanciar um país? Eita!!! :?

Hebert_Coelho

Eu não sei c c3po é o seu problema.

Acho que você tinha que atacar o fato de você não estar fechando o a transação após realizar alguma tarefa no DB.

R

llucas:
Não que eu saiba =/

Olha só eu notei que a memória sobe muito quando é carregada uma página com muitas informações do banco de dados
Tipo… Tem página com muito informação mesmo.

vc precisa implementar um negócio chamado paginação sob demanda

Criado 1 de junho de 2012
Ultima resposta 4 de jun. de 2012
Respostas 17
Participantes 4