Problema de muitas conexões com postgres e hibernate

2 respostas
M

Bom dia :slight_smile:

Estou testando minha app e somente eu acessando, está com problemas de muitas conexões pq existem pesquisas que são feitas na hora, mas isso não pode acontecer. Não sei mais o que fazer pq pensei que seria problema de finalizar a sessionFactory ou a session, mas já vi que não é.

Todas minhas actions criam uma nova instância da minha classe Queries, que é onde se concentram as ações com o BD, pensei em fazer ela como singleton mas ai eu não teria como passar a classe para a Queries e o hibernate não sei como ele iria se comportar para acertar qual tabela usar, será que um set/get + singleton ajudaria?

Alguém tem alguma sugestão?

Queries.java

public class Queries {

	private SessionFactory sessionFactory;
	private Class<Object> _class = null;
	private Transaction tx;
	private Session session;

	@SuppressWarnings("unchecked")
	public Queries(Class classe) {
		_class = classe;
		sessionFactory = new Configuration().addClass(_class).buildSessionFactory();
		iniciarOperacao();

	}

	public void iniciarOperacao() {

		session = sessionFactory.openSession();
		tx = session.beginTransaction();

	}

	public void inserir(Object bean) {
		// iniciarOperacao();
		session.save(bean);
		tx.commit();
		session.flush();
		session.close();
	}

	@SuppressWarnings("unchecked")
	public boolean verificarUnidadeID(Integer ID) {
		List<Object> resultados = null;
		// iniciarOperacao();
		Query query = session
				.createSQLQuery("SELECT * FROM unidade WHERE unidade_id = "
						+ ID);
		resultados = query.list();
		session.close();
		if (resultados.size() == 0) {
			return true;
		}
		return false;
	}

	public void fecharConexao(){
		
		if(sessionFactory.isClosed() == false) {
			sessionFactory.close();
			sessionFactory = null;
		}
		
		if(session.isConnected() == true || session.isOpen() == true){
			session.clear();
			session.close();
			session = null;
		}
	}

}

ActionQualquer.java

Queries queries = new Queries(br.com.sgdi.bean.regional.RegionalBean.class);
		List<Object> lista = queries.buscarTodosResultados();

Na Queries eu coloquei 2 métodos de como eu uso, um para métodos simples como inserir, atualizar e deletar e outros para busca e na Action é desse jeito que eu chamo, só muda a classe que eu passo para o construtor da Queries.

Tem algum jeito de melhorar esse problema?

[]'s

2 Respostas

andreiribas

acho que usar um pool de conexões vai te ajudar bastante. E outra, acho que não é preciso fechar a session a cada operação que você faz.

qmx

Cara criar uma session factory é muito custoso!!! vc nunca vai aproveitar o pool pq ele vai derrubar e reabrir o pool a cada chamada dessa!]
Faz aquele HibernateUtil indicado pela documentação do hibernate

Criado 1 de março de 2008
Ultima resposta 1 de mar. de 2008
Respostas 2
Participantes 3