JSF - Otimizar desempenho

17 respostas
L

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

H

Por curiosidade… Seus MBs estão como SessionScoped?

L

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?

H

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.

L

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

H

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

L

Tirei todos os sessionbean pra testar e da no mesmo

H

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

L

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.

H

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é?

L

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

H

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?

L

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

H

Cara, eu acho que pode ser isso viu.

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

L

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>

B

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!!! :?

H

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