[RESOLVIDO]Problema Hibernate

9 respostas
J

Pessoal estou tendo o seguinte problema na minha aplicação o hibernate está abrindo uma nova conexão para cada requisição feita ao banco de dados, sera q o erro está aqui ? Estou perdidinho

private HibernateUtil() {
        sessionFactory = new AnnotationConfiguration()
                .setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect")
                .setProperty("hibernate.connection.driver.class", "com.mysql.jdbc.Driver")
                .setProperty("hibernate.connection.url","localhost")
                .setProperty("hibernate.connection.username", "teste")
                .setProperty("hibernate.connection.password", "teste")
                .setProperty("hibernate.hbm2ddl.auto", "update")
                .setProperty("hibernate.show_sql", "true")
                .setProperty("hibernate.format_sql", "true")
                .setProperty("hibernate.c3p0.acquire_increment", "1")
                .setProperty("hibernate.c3p0.idle_test_period", "100")
                .setProperty("hibernate.c3p0.max_size", "10")
                .setProperty("hibernate.c3p0.max_statements", "0")
                .setProperty("hibernate.c3p0.min_size", "5")
                .setProperty("hibernate.c3p0.time_out", "100")
                .addAnnotatedClass(Entidade.class)
                .addAnnotatedClass(UsuarioTo.class)
                .addAnnotatedClass(Solicitacao.class)
                .addAnnotatedClass(Doacao.class)
                .addAnnotatedClass(Produtos.class)
                .addAnnotatedClass(Reserva.class)
                .addAnnotatedClass(Email.class)
                .addAnnotatedClass(Telefone.class)
                .addAnnotatedClass(Endereco.class)
                .addAnnotatedClass(Estado.class)
                .addAnnotatedClass(Municipio.class)
                .addAnnotatedClass(AtendimentoSolicitacao.class)
                .buildSessionFactory();

    }

O ERRO

om.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Usuário 'atrixian' já possui mais que o valor máximo de conexões (max_user_connections) ativas
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	com.mysql.jdbc.Util.getInstance(Util.java:381)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
	com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
	com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:910)
	com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3938)
	com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1273)
	com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031)
	com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
	com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
	sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constru

9 Respostas

L

parece que vc ja usou o maximo de conexoes do pool,tente aumentar o tamanho do pool de conexoes

J

Mas pensei que ao entrar no sistema o Hibernate iria criar uma conexão para o usuário e então para cada requisição ele utilizaria aquela conexão, ou então ao fazer uma requisição ele criaria a conexão e no final da requisição ele fecharia aquela conexão. sei lá

Fernando_Generoso_da

A tua classe que fornece o session, é um singleton?? O problema pode estar aí…

Fernando

felippesh

Coloque o código da sua classe que abre a sessão com o hibernate.

J

esse é meu hibernateutil

public class HibernateUtil {

private static final long serialVersionUID = 1L;
private static HibernateUtil me;
private SessionFactory sessionFactory;

private HibernateUtil() {
sessionFactory = new AnnotationConfiguration()
.setProperty("hibernate.dialect","org.hibernate.dialect.MySQLDialect")
.setProperty("hibernate.connection.driver.class", "com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url","jdbc:mysql://xxxx:3306/sams_desenv")
.setProperty("hibernate.connection.username", "root")
.setProperty("hibernate.connection.password", "root")
.setProperty("hibernate.hbm2ddl.auto", "update")
.setProperty("hibernate.show_sql", "true")
.setProperty("hibernate.format_sql", "true")
.setProperty("hibernate.c3p0.acquire_increment", "1")
.setProperty("hibernate.c3p0.idle_test_period", "100")
.setProperty("hibernate.c3p0.max_size", "10")
.setProperty("hibernate.c3p0.max_statements", "0")
.setProperty("hibernate.c3p0.min_size", "5")
.setProperty("hibernate.c3p0.time_out", "100")
.addAnnotatedClass(Entidade.class)
.addAnnotatedClass(UsuarioTo.class)
.addAnnotatedClass(Solicitacao.class)
.addAnnotatedClass(Doacao.class)
.addAnnotatedClass(Produtos.class)
.addAnnotatedClass(Reserva.class)
.addAnnotatedClass(Email.class)
.addAnnotatedClass(Telefone.class)
.addAnnotatedClass(Endereco.class)
.addAnnotatedClass(Estado.class)
.addAnnotatedClass(Municipio.class)
.addAnnotatedClass(AtendimentoSolicitacao.class)
.buildSessionFactory();

}
public Session getSession(){
Session toReturn = sessionFactory.openSession();
toReturn.beginTransaction();
return toReturn;
}
public static HibernateUtil getInstace() {
if (me == null) {
me = new HibernateUtil();
}
return me;
}
}
felippesh

Colega,
muito provavelmente, o problema esta no método getSession(), onde toda vez que pega a session, esta sendo inciado uma transaction (toReturn.beginTransaction), o que deve estar deixando várias transações abertas no seu sistema. Sugestão:

private static final SessionFactory sessionFactory;
    public static Session getCurrentSession() throws HibernateException {
        Session s = (Session) session.get();       
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }
}

e o beginTransaction vc chama em sua DAO, sempre seguido de commit().

Fernando_Generoso_da

Isso, como o amigo felippesh falou…

isso pq da maneira que você está fazendo, além de apenas iniciar uma transação e deixá-la pendurada, você utiliza transação para qualquer ação no banco, o que não necessistaria, como select por exemplo, deixando a aplicação mais lenta.

Fernando

J

Valeu pessoal pela ajuda de grande valia, vou implementar essas modificações.

J

FUNCIONOU ERA ISSO MESMO, MAIS UMA VEZ MUITO OBRIGADO A TODOS QUE PRONTAMENTE ME AJUDARAM… :smiley:

Criado 27 de agosto de 2009
Ultima resposta 27 de ago. de 2009
Respostas 9
Participantes 4