[Resolvido]Problema com timeout do MySQL

3 respostas
Djonatah

Boa noite,

Eu tenho enfrentado um problema conhecido na comunidade: O timeout de conexão com o MySQL após 8h de uso. Eu procurei diversas soluções na web e mesmo dentro do GUJ, mas nenhuma delas ofereceu a solução para meu problema. Implementei pool de conexões e alterei parâmetros na url de conexão com o banco, mas não foi o suficiente para acabar com a seguinte exceção:

om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
    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:984)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    com.mysql.jdbc.ConnectionImpl.getMutex(ConnectionImpl.java:3032)
    com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4606)
    org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:217)
    org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:196)
    br.org.SEJA.dao.DaoFactory.rollback(DaoFactory.java:44)
    br.org.SEJA.interceptor.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:44)
    br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
    br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
    br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
    br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
Aqui vai meu xml de configuração do hibernate:
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://seja.teo.br/retiros?autoReconnectForPools=true</property>
        <property name="hibernate.connection.username">usuario</property>
        <property name="hibernate.connection.password">*****</property>

        <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_periods">300</property>
        
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>

Alguém tem uma idéia do que pode ser a causa do meu problema? (eu li algo controle de transações: Algumas não precisam de commit por serem apenas consulta, ou algo assim)

Agradeço a ajuda.

3 Respostas

J

bom dia Djonatah,

Já tive problema de Timeout com o MySQL (diferente desse que vc reportou), consegui resolver alterando os valores padrões das variaveis.
Pra ver os valores, use (veja por interactive e wait).

Djonatah

Obrigado pela reposta joellazzari, já havia cogitado alterar a variavel de timeout do MySQL. Se não encontrar outra solução eu acredito que vá fazer isso mesmo.

Aguardo mais sugestões o/

Djonatah

Acabei descobrindo que o meu problema estava relacionado as minhas configurações do pool de conexões. Até onde eu li, parece que o hibernate faz o reconhecimento automático de quando estamos utilizando o C3pO para pool de conexões. Mas não foi o meu caso, então eu tive que explicitamente declarar qual era a classe que estava providenciando as conexões para a pool, e isso através da seguinte configuração:

Espero que venha ajudar mais pessoas em tempos futuros futuros :wink:

Abraços

Criado 17 de outubro de 2010
Ultima resposta 21 de out. de 2010
Respostas 3
Participantes 2