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

7 respostas
J

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

7 Respostas

R

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

J

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!

R

Mostra ai sua classe Categoria

R

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

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

e deixa assim e testa ai

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

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

R

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.

Criado 18 de outubro de 2010
Ultima resposta 21 de out. de 2010
Respostas 7
Participantes 2