Conexão com o Banco cai após determinado tempo

Tenho um servidor Tomcat rodando em uma máquina, nesse servidor tenho vários sistemas. O ultimo sistema que desenvolvi, que é uma API REST com Vraptor+Hibernate está apresentando alguns problemas.

Depois de algumas horas ocioso as operações de PUT, Delete e POST começam a dar erro, porém funcionam. A página não atualiza e eu tenho o erro 500. Vi em alguns lugares que o tempo padrão de uma conexão ociosa no Mysql é de 8 horas, e que eu tinha que configurar o pool de conexões do Hibernate, mesmo fazendo isso o erro ainda continua.

Entrei no Log do Tomcat e achei esses erros:

Caused by: org.hibernate.TransactionException: commit failed
Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: java.net.SocketException: Software caused connection abort: socket write error

Essa é minha config do Hibernate:

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/unionbd?autoReconnect=true</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.autoReconnect">true</property>
        <property name="connection.autoReconnectForPools">true</property>

        <property name="initialSize">5</property>
        <property name="maxActive">30</property>
        <property name="removeAbandoned">false</property>
        <property name="testOnBorrow">true</property>
        <property name="testOnReturn">true</property>
        <property name="validationQuery">1</property>


        <!-- C3P0 -->
        <property name="c3p0.acquire_increment">5</property>
        <property name="c3p0.timeout">0</property>
        <property name="c3p0.min_size">3</property>
        <property name="c3p0.max_size">100</property>
        <property name="c3p0.max_statements">0</property>
        <property name="c3p0.idle_test_period">3000</property>
        <property name="c3p0.testConnectionOnCheckout">true</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

Alguém pode ajudar?

Coloca o código do seu serviço. Por um acaso você está tentando reaproveitar sessões do Hibernate ?

1 curtida

O serviço seria o HibernateUtil? Acho que não estou reaproveitando as sessões, pois sempre que faço alguma operação eu fecho a conexão. Em outros sistemas com JSF eu contornava um problema semelhante fazendo uma thread ficar pingando no banco a cada 1 hora, porém com a API que fiz agora com Vraptor, não funciona.

Qual a versão do VRaptor?
Porque você não usa o plugin vraptor-hibernate e deixa que ele controle as transações p/ vc … anotando os métodos que persistem com @Transactional

<dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-hibernate</artifactId>
    <version>4.0.3</version>
 </dependency>

Além de tudo ficar dentro de transações, você também não precisa ficar “fechando” conexões…

@Transactional
public void save(Projeto projeto) {
    this.session.save(projeto);
}

:wink:

Interessante, não conhecia essa ferramenta. Mas pra mim aplicar tudo isso no projeto iria demorar muito.

Não demora muito não… é bem tranquilo na verdade…

Caso queria algo p/ consultar, neste projeto eu utilizei esses recursos que te falei.
https://github.com/guivirtuoso/vraptor4-angularjs-jwt

Como é um projeto maven, no pom.xml vai constar a dependencia do vraptor-hibernate.

Abs

1 curtida

Valeu, vou dar uma olhada e implementar no próximo projeto pois consegui resolver esse.

Se você resolveu posta a solução, outra pessoa pode passar pelo mesmo problema.

Resolvi o problema adicionando duas propriedades no arquivo My.ini que fica na pasta do MYSQL. Por padrão o mysql derruba a conexão após 8 horas se estiver ocioso.

Foi só colocar:

wait_timeout = 99999999999999999999999
interactive_timeout = 99999999999999999999999

Sim sim, eu sempre posto a solução rs

Desculpe reabrir o tópico, estou com um sistema prestes a ir para produção e depois de por no servidor estou com esse problema, passou as 8 horas da pau, porém não tenho acesso ao my.ini, e configurei o C3p0 e tambem nao solucionou! Tem alguma forma de resolver isso, uma outra configuração?