Servidor tomcat bloqueado

5 respostas
aszarael

Boa Tarde Pessoal,

estou com o seguinte problema, tenho uma aplicação web, desenvolvida em jsp + hibernate + oracle.

Na Maior parte do tempo ela funciona corretamente, mais algumas vezes, a aplicação não responde mais, e tenho que algumas vezes reiniciar o tomcat, e as vezes ate a maquina para que ela volte a funcionar.

O detalhe, que nos log's, tanto do tomcat, quando os de debug da aplicação não se encontram nenhuma erro.

Alguem teria alguma ideia ?

Caso, ajude, eu utilizo a conexão do manager da aplicação, ou seja onde crio as conexões com o banco;

package com.br.dao;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class ManagerEntityManager {
	
	private static EntityManagerFactory factory;
	private static EntityManagerFactory factoryMobile;
    private static EntityManager entityManager;
    private static EntityManager entityManagerMobile;
	
    /**
     * Cria uma entity manager factory única e o retorna em todas as demais chamadas
     */
    private static EntityManagerFactory  getFactory() {

    	try{
    		if (factory == null || !factory.isOpen()) {        	
    			factory = Persistence.createEntityManagerFactory("Portal");
    		}
    	}catch(Exception e){    
    		System.out.println("Conexão Fechada");
    		factory = Persistence.createEntityManagerFactory("Portal");
    		System.out.println("Abrindo nova conexão");
        }
        return factory;
    }
    
    private static EntityManagerFactory  getFactoryMobile() {

    	try{
    		if (factoryMobile == null || !factoryMobile.isOpen()) {        	
    			factoryMobile = Persistence.createEntityManagerFactory("PortalMobile");
    		}
    	}catch(Exception e){    
    		System.out.println("Conexão Fechada");
    		factoryMobile = Persistence.createEntityManagerFactory("PortalMobile");
    		System.out.println("Abrindo nova conexão");
        }
        return factoryMobile;
    }    
    
    /**
     * Cria um entity manager único (se criar = true) para a thread e o retorna em todas as demais chamadas
     */
    private static EntityManager geraEntityManager() {

    	getFactory();
   	
    	try{
    		if (entityManager == null || !entityManager.isOpen()) {
    			entityManager = getFactory().createEntityManager();
    		}
    	}catch(Exception e){  
    		entityManager = getFactory().createEntityManager();
    	}
        return entityManager;
    }
    
    private static EntityManager geraEntityManagerMobile() {

    	getFactoryMobile();
   	
    	try{
    		if (entityManagerMobile == null || !entityManagerMobile.isOpen()) {
    			entityManagerMobile = getFactoryMobile().createEntityManager();
    		}
    	}catch(Exception e){  
    		entityManagerMobile = getFactoryMobile().createEntityManager();
    	}
        return entityManagerMobile;
    }


    public EntityManager getEntityManager(){
		return geraEntityManager();
	}

    public EntityManager getEntityManagerMobile(){
		return geraEntityManagerMobile();
	}
    

}

5 Respostas

Ataxexe

Fiquei curioso pra saber o motivo de você ter um entity manager só para dispositivos móveis.

De qualquer forma, você já tentou usar um profiler, verificar a memória ou as threads?

Também há um probleminha com entendimentos: o EntityManagerFactory não cria conexões com o banco (como está escrito nos “logs” da classe), talvez você esteja fazendo confusão com conceitos e usando isso de forma errada (fechando a factory e abrindo novamente - o que iria consumir bastante memória na sua aplicação e, com certeza, iria requerer reiniciar o servidor).

aszarael

Ataxexe, só faço a criação novamente, quando, a entidade está nula ou fechada, de resto, se verifcar, apenas pego o objeto já instanciado para a operação.

Teria alguma dica ou exemplo para me ajudar ??

Ataxexe

aszarael:
Ataxexe, só faço a criação novamente, quando, a entidade está nula ou fechada, de resto, se verifcar, apenas pego o objeto já instanciado para a operação.

Teria alguma dica ou exemplo para me ajudar ??

Você pode tentar usar o JProfiler ou o próprio JDK pra tirar heap dumps e thread dumps (os comandos jmap, jstack e jps serão úteis). O PsiProbe pode te ajudar a ver algumas informações de forma gráfica também.

Outra coisa: o que você chama de “entidade fechada”? Realmente tenho a impressão de que você está se perdendo nos conceitos.

aszarael

O que quero dizer é, como utiliza o pool de conexões, quando o variavel está nula, eu pelo outra conexão para o pool de conexão.

Você teria alguma exemplo do deste metodos para analse ?

Ataxexe

aszarael:
O que quero dizer é, como utiliza o pool de conexões, quando o variavel está nula, eu pelo outra conexão para o pool de conexão.

Você teria alguma exemplo do deste metodos para analse ?

Novamente, pelo seu código, você verifica se o EntityManagerFactory está fechado para abrí-lo novamente. Isso seria análogo a você descartar o pool de conexões inteiro e criá-lo novamente depois. Eu não sei se você está fechando esse objeto porque isso não é claro pelo seu código.

As documentações você pode dar uma olhada aqui:

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jstack.html
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html

Basicamente o jps te dará o PID do processo Java que você precisa analisar (o processo que roda o Tomcat), o jstack te dará um thread dump e o jmap um heap dump. Você pode analisá-los com outras ferramentas (eu uso o JProfiler pra analisar os heap dumps e o samurai pra analisar os thread dumps). Você pode até usar o Java Mission Control pra analisar os dumps (embora eu não saiba dizer se ele analisa ambos os dumps).

http://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html

Você pode considerar, também, utilizar um servidor de aplicações (JBoss por exemplo) e se livrar desse trabalho de gerenciar a criação do EntityManager e do EntityManagerFactory, que me parece ser o seu gargalo. Se não quiser fazer isso, ao menos dê uma olhada em alguma práticas para gerenciar isso:

Outra coisa: não entendi ainda o motivo de dois EntityManagerFactory, isso pode ser também um gargalo no seu sistema caso não esteja bem gerenciado.

Criado 11 de dezembro de 2014
Ultima resposta 12 de dez. de 2014
Respostas 5
Participantes 2