SQL travando com erro "too many session"

Olá pessoal,

Estou desenvolvendo um aplicativo e quando faço muitas operações em banco, como cadastrar vários usuários ou corridas, etc… o SQL trava e o eclipse retorna o erro :

10:43:34 INFO [SessionFactoryImpl ] building session factory 10:43:34 INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured 10:43:34 WARN [JDBCExceptionReporter] SQL Error: 1040, SQLState: 08004 10:43:34 ERROR [JDBCExceptionReporter] Data source rejected establishment of connection, message from server: "Too many connections"

Imagino que isso seria alguma sessão que não fechei, pois teoricamente cada operação deveria abrir e fechar uma sessão.

A minha classe fabricaDeSessao deveria abrir e fechar a sessão de acordo com o método solicitado:

[code]package br.com.sistaxi.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.sistaxi.beans.Cliente;
import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.beans.Usuario;

public class FabricaDeSessao {

public Session abreSessao(Object objeto) {

	AnnotationConfiguration cfg = new AnnotationConfiguration();
	// cfg.addAnnotatedClass(objeto.getClass());
	cfg.addAnnotatedClass(Cliente.class);
	cfg.addAnnotatedClass(Usuario.class);
	cfg.addAnnotatedClass(Taxi.class);
	cfg.addAnnotatedClass(Corrida.class);
	SessionFactory factory = cfg.buildSessionFactory();
	Session session = factory.openSession();
	session.beginTransaction();

	return session;

}

public void fechaSessao(Session session) {
	session.getTransaction().commit();
	session.close();
}

}[/code]

E aqui está minha classe Dao:

[code]package br.com.sistaxi.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import br.com.sistaxi.beans.Cliente;
import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.beans.Usuario;

public class Dao {
private Session session;
private String mensagem;
private FabricaDeSessao fabricaDeSessao = new FabricaDeSessao();
// private Cliente cliente = new Cliente();
private Corrida corrida = new Corrida();
private Taxi taxi = new Taxi();

public String salva(Object objeto) {
	try {
		session = fabricaDeSessao.abreSessao(objeto);
		session.saveOrUpdate(objeto);
		fabricaDeSessao.fechaSessao(session);
		return "Informação salva com sucesso!";
	} catch (Exception e) {

		mensagem = "Erro: " + e;
		return mensagem;
	}

}

public boolean validaLogin(Usuario usuario) {
	session = fabricaDeSessao.abreSessao(usuario);
	Criteria select = session.createCriteria(usuario.getClass());
	select.add(Restrictions.eq("login", usuario.getLogin()));
	select.add(Restrictions.eq("senha", usuario.getSenha()));
	if (select.list().isEmpty()) {
		fabricaDeSessao.fechaSessao(session);
		return false;
	} else {
		fabricaDeSessao.fechaSessao(session);
		return true;
	}

}

@SuppressWarnings("unchecked")
public ArrayList<Usuario> listaUsuario(Usuario usuario) {
	session = fabricaDeSessao.abreSessao(usuario);
	List<Usuario> lista = new ArrayList<Usuario>();
	lista = session.createCriteria(Usuario.class).list();
	fabricaDeSessao.fechaSessao(session);
	return (ArrayList<Usuario>) lista;

}

@SuppressWarnings("unchecked")
public ArrayList<Taxi> listaTaxi(Taxi taxi) {
	session = fabricaDeSessao.abreSessao(taxi);
	List<Taxi> lista = new ArrayList<Taxi>();
	lista = session.createCriteria(Taxi.class).list();
	fabricaDeSessao.fechaSessao(session);
	return (ArrayList<Taxi>) lista;

}

public Object getById(Object objeto, int id) {
	// Usuario usuario = new Usuario();
	session = fabricaDeSessao.abreSessao(objeto);

	objeto = session.get(objeto.getClass(), id);
	fabricaDeSessao.fechaSessao(session);
	return objeto;

}

public Usuario getUsuarioByLoginSenha(Usuario usuario) {
	session = fabricaDeSessao.abreSessao(usuario);
	Criteria select = session.createCriteria(usuario.getClass());
	select.add(Restrictions.eq("login", usuario.getLogin()));
	select.add(Restrictions.eq("senha", usuario.getSenha()));
	usuario = (Usuario) select.list().get(0);
	fabricaDeSessao.fechaSessao(session);
	return usuario;
}

public String apaga(Object objeto) {
	try {
		session = fabricaDeSessao.abreSessao(objeto);
		session.delete(objeto);
		fabricaDeSessao.fechaSessao(session);
		return "Informação salva com sucesso!";
	} catch (Exception e) {

		mensagem = "Erro: " + e;
		return mensagem;
	}
}

public String atualiza(Object objeto) {
	// try {
	session = fabricaDeSessao.abreSessao(objeto);
	session.update(objeto);
	fabricaDeSessao.fechaSessao(session);
	return "Informação salva com sucesso!";
	// } catch (Exception e) {

	// mensagem = "Erro: " + e;
	// return mensagem;
	// }

}

@SuppressWarnings("unchecked")
public ArrayList<Cliente> listarCliente(Cliente cliente) {
	session = fabricaDeSessao.abreSessao(cliente);
	List<Cliente> lista = new ArrayList<Cliente>();
	lista = session.createCriteria(Cliente.class).list();
	fabricaDeSessao.fechaSessao(session);
	return (ArrayList<Cliente>) lista;
}

public Object getClienteByNome(Cliente cliente) {
	// Usuario usuario = new Usuario();
	session = fabricaDeSessao.abreSessao(cliente);
	Criteria select = session.createCriteria(Cliente.class);
	select.add(Restrictions.eq("nome", cliente.getNome()));
	cliente = (Cliente) select.list().get(0);
	fabricaDeSessao.fechaSessao(session);
	return cliente;

}

@SuppressWarnings("unchecked")
public List<Corrida> getCorridasAtivas() {

	session = fabricaDeSessao.abreSessao(corrida);
	Criteria select = session.createCriteria(Corrida.class);
	select.add(Restrictions.eq("situacao", "ativa"));
	List<Corrida> lista = new ArrayList<Corrida>();
	lista = select.list();
	fabricaDeSessao.fechaSessao(session);
	return lista;

}

public Object getCorridaById(int id) {
	session = fabricaDeSessao.abreSessao(corrida);
	Criteria select = session.createCriteria(Corrida.class);
	select.add(Restrictions.eq("id", id));
	corrida = (Corrida) select.list().get(0);
	fabricaDeSessao.fechaSessao(session);
	return corrida;

}
public Taxi getTaxibyRt (String rt) {

	session = fabricaDeSessao.abreSessao(taxi);
	Criteria select = session.createCriteria(Taxi.class);
	select.add(Restrictions.eq("rt", rt));
	taxi = (Taxi) select.list().get(0);
	fabricaDeSessao.fechaSessao(session);
	return taxi;

}[/code]

não uso hibernate.xml e sim hibernate.properties e anottations

hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect hibernate.connection.driver_class = com.mysql.jdbc.Driver hibernate.connection.url = jdbc:mysql://localhost/sistaxi hibernate.connection.username = root hibernate.connection.password =1234 hibernate.show_sql = true hibernate.format_sql = true

Agradeço desde já pelo tempo dedicado ao auxilio…

Muito Obrigado

Pra começar você tem alguns erros conceituais ai, sendo os mais importantes corrigir:

  1. A SessionFactory deve ser aberta apenas uma vez. Ela cria toda a configuração, o que não é necessário criar diversas vezes. A session que deve ser aberta diversas vezes.
  2. Controle transacional! Você realmente quer que cada transação tenha escopo apenas durante um método do DAO?

Continuando…

Se der uma exception (está lançando?) em algum método, a session pode ter sido aberta e não fechada, já que isso é feito no fim dos metodos.
É uma app web? desktop?

Olá,

1 ) pelo q entendi o ideal seria colocar a factory no login, e depois disso esquece-la, correto?
2 ) nao entendi, nem imagino uma outra maneira de fazer
3 ) sistema web

Muito obrigado

up