Servidor tomcat bloqueado

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;

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

}[/code]

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).

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

[quote=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 ??

[/quote]

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.

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 ?

[quote=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 ?

[/quote]

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.