Erro Hibernate -> FATAL: sorry, too many clients already

Fala aí galera blz!?

Eu to começando no Hibernate e tõ com um problema aqui que não consigo resolver.
Eu tô construindo uma aplicaçãozin usando JSF 2.0 com Hibernate.
até o momento tive poucas dificuldades exceto quando me deparei com esse erro que não tenho a menor ideia de como resolver.
Eu fiz um CRUD e quando estou cadastrando os dados no banco, simplesmente do nada, aparece esse erro:

FATAL: sorry, too many clients already

O que poderia ser?
Alguém poderia ajudar por favor? Já pesquisei na web mas não encontrei nada concreto (ou não entendi o que li heheh).

obs: Abaixo segue as classes que estou usando para persistir os dados.

package persistence;

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

public class HibernateUtil {
private static final SessionFactory sessionFactory;

static {
    try {
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public static Session getSession() {
	sessionFactory.close();
    return sessionFactory.openSession();
}

}

package persistence;

import model.Pergunta;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class PerguntaPersisty extends HibernateUtil {

public Pergunta find(double codigo){
	Session session = HibernateUtil.getSession();
	Transaction tx = session.beginTransaction();
	
	Pergunta pergunta = (Pergunta) session.get(Pergunta.class, codigo);
	
	return pergunta;
}

}

package persistence;

import model.Resposta;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class RespostaPersisty extends HibernateUtil {

public Resposta find(int codigo){
	Session session = HibernateUtil.getSession();
	Transaction tx = session.beginTransaction();
	Resposta resposta = (Resposta) session.get(Resposta.class, codigo);
	return resposta;
}

}

package persistence;

import org.hibernate.Session;
import org.hibernate.Transaction;

import model.Pessoa;

public class PessoaPersisty extends HibernateUtil{

public void salvar(Pessoa p){
	Session session = HibernateUtil.getSession();
	Transaction tx = session.beginTransaction();
	session.save(p);
	//tx.commit();
    session.close();
}

public Pessoa find(int codigo){
	Session session = HibernateUtil.getSession();
	Transaction tx = session.beginTransaction();
	Pessoa pessoa = (Pessoa) session.get(Pessoa.class, codigo);
	//tx.commit();
    session.close();
	return pessoa;	
}

}

De qualquer forma muito obrigado galera!
Abraços,
Jhonys

Blz meu vélho, mostra ai suas classes entidades, tipo as classes mapeadas.

fala aew galera!!
Minhas classes entidades são essas aqui oh:

package model;

import java.io.Serializable;
import javax.persistence.*;

/**

  • The persistent class for the entrevista database table.

*/
@Entity
@SequenceGenerator(name = “entrevista_codigo_seq”, sequenceName =“entrevista_codigo_seq”,
initialValue = 1 , allocationSize = 1)

public class Entrevista implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy =GenerationType.SEQUENCE, generator = "entrevista_codigo_seq")
private Integer codigo;

//bi-directional many-to-one association to Pergunta
@ManyToOne
@JoinColumn(name="codigo_pergunta")
private Pergunta pergunta;

//bi-directional many-to-one association to Pessoa
@ManyToOne
@JoinColumn(name="codigo_entrevistado")
private Pessoa pessoa;

//bi-directional many-to-one association to Resposta
@ManyToOne
@JoinColumn(name="codigo_reposta")
private Resposta resposta;

public Entrevista() {
}

public Integer getCodigo() {
	return this.codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public Pergunta getPergunta() {
	return this.pergunta;
}

public void setPergunta(Pergunta pergunta) {
	this.pergunta = pergunta;
}

public Pessoa getPessoa() {
	return this.pessoa;
}

public void setPessoa(Pessoa pessoa) {
	this.pessoa = pessoa;
}

public Resposta getResposta() {
	return this.resposta;
}

public void setResposta(Resposta resposta) {
	this.resposta = resposta;
}

}

package model;

import java.io.Serializable;
import javax.persistence.*;

import java.util.List;

/**

  • The persistent class for the pergunta database table.

*/
@Entity
public class Pergunta implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private double codigo;

private String descricao;

//bi-directional many-to-one association to Entrevista
@OneToMany(mappedBy="pergunta")
private List<Entrevista> entrevistas;

//bi-directional many-to-one association to Categoria
@ManyToOne
@JoinColumn(name="codigo_categoria")
private Categoria categoria;

//bi-directional many-to-one association to Resposta
@OneToMany(mappedBy="pergunta")
private List<Resposta> respostas;

public Pergunta() {
}

public double getCodigo() {
	return this.codigo;
}

public void setCodigo(double codigo) {
	this.codigo = codigo;
}

public String getDescricao() {
	return this.descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public List<Entrevista> getEntrevistas() {
	return this.entrevistas;
}

public void setEntrevistas(List<Entrevista> entrevistas) {
	this.entrevistas = entrevistas;
}

public Categoria getCategoria() {
	return this.categoria;
}

public void setCategoria(Categoria categoria) {
	this.categoria = categoria;
}

public List<Resposta> getRespostas() {
	return this.respostas;
}

public void setRespostas(List<Resposta> respostas) {
	this.respostas = respostas;
}

}

package model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;

/**

  • The persistent class for the pessoa database table.

*/
@Entity
public class Pessoa implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private Integer codigo;

private String nome;

@Column(name="numero_residencia")
private Integer numeroResidencia;

@Column(name="referencia_residencia")
private String referenciaResidencia;

//bi-directional many-to-one association to Entrevista
@OneToMany(mappedBy="pessoa")
private List<Entrevista> entrevistas;

//bi-directional many-to-one association to Endereco
@ManyToOne
@JoinColumn(name="codigo_endereco")
private Endereco endereco;

public Pessoa() {
}

public Integer getCodigo() {
	return this.codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public String getNome() {
	return this.nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public Integer getNumeroResidencia() {
	return this.numeroResidencia;
}

public void setNumeroResidencia(Integer numeroResidencia) {
	this.numeroResidencia = numeroResidencia;
}

public String getReferenciaResidencia() {
	return this.referenciaResidencia;
}

public void setReferenciaResidencia(String referenciaResidencia) {
	this.referenciaResidencia = referenciaResidencia;
}

public List<Entrevista> getEntrevistas() {
	return this.entrevistas;
}

public void setEntrevistas(List<Entrevista> entrevistas) {
	this.entrevistas = entrevistas;
}

public Endereco getEndereco() {
	return this.endereco;
}

public void setEndereco(Endereco endereco) {
	this.endereco = endereco;
}

}

package model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;

/**

  • The persistent class for the resposta database table.

*/
@Entity
public class Resposta implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private Integer codigo;

private String descricao;

@Column(name="numero_resposta")
private Integer numeroResposta;

//bi-directional many-to-one association to Entrevista
@OneToMany(mappedBy="resposta")
private List<Entrevista> entrevistas;

//bi-directional many-to-one association to Pergunta
@ManyToOne
@JoinColumn(name="codigo_pergunta")
private Pergunta pergunta;

public Resposta() {
}

public Integer getCodigo() {
	return this.codigo;
}

public void setCodigo(Integer codigo) {
	this.codigo = codigo;
}

public String getDescricao() {
	return this.descricao;
}

public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public String getNumeroResposta() {
	return Integer.toString(this.numeroResposta);
}

public void setNumeroResposta(Integer numeroResposta) {
	this.numeroResposta = numeroResposta;
}

public List<Entrevista> getEntrevistas() {
	return this.entrevistas;
}

public void setEntrevistas(List<Entrevista> entrevistas) {
	this.entrevistas = entrevistas;
}

public Pergunta getPergunta() {
	return this.pergunta;
}

public void setPergunta(Pergunta pergunta) {
	this.pergunta = pergunta;
}

@Override
public boolean equals(Object resposta){
	Resposta r = (Resposta) resposta;
	return getCodigo().equals(r.getCodigo());
}

@Override
public int hashCode(){
	return codigo.hashCode();
}

@Override
public String toString() {
	// TODO Auto-generated method stub
	return Integer.toString(codigo);
}

}

Uma abraço!
Jhonys
Aguardando help de vcs!

Mostra ai sua classe Categoria

Bom, o problema é que vc esta abrindo muitas conexoes com o banco e possívelmente não esta fechando. Ai esta estourando o numero de conexoes. Mostra a configuração com o hibernate ai para ou persistence.xml ou hibernate.cfg.xml

[code]public static Session getSession() {
sessionFactory.close(); // <-- tira isto aqui
return sessionFactory.openSession();
}

[/code]

e deixa assim e testa ai

public static Session getSession() {
return sessionFactory.openSession();
}

e tem uma dúvida, pq vc comentou os tx.commit() ??
já que vc esta usando transação, vc precisa sempre comitar ok.

Sua busca não precisa abrir transação, pois quando vc for salvar pode levantar um erro de transação já aberta .

muda isto:


public Pergunta find(double codigo){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();

Pergunta pergunta = (Pergunta) session.get(Pergunta.class, codigo);

return pergunta;
} 

para isto:


public Pergunta find(double codigo){
Session session = HibernateUtil.getSession();
try{ 
Pergunta pergunta = (Pergunta) session.get(Pergunta.class, codigo);
return pergunta;
}finally{
  if(session != null){
     session.close();
   }
}
} 

uma dica, já que é uma aplicação de teste vc pode ficar abrindo e fechando conexoes, mas se for uma aplicação mais “real” seria bom vc gerenciar apenas uma conexao com o banco e quando o usuario sair, esta conexao seria fechada. mas isto é um assunto para outro tópico.