Reproduza com.mysql.jdbc.exceptions.jdbc4.CommunicationsException com uma configuração de Spring, hibernate e C3P0

Eu recebi este erro do código de produção:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: O último pacote recebido com sucesso do servidor foi 36940 segundos atrás.O último pacote enviado com sucesso ao servidor foi 36940 segundos atrás, o que é maior que o valor configurado pelo servidor 'wait_timeout'. Você deve considerar expirar e / ou testar a validade da conexão antes de usar em seu aplicativo, aumentando os valores configurados pelo servidor para tempos limite do cliente ou usando a propriedade de conexão Connector / J 'autoReconnect = true' para evitar esse problema.

E agora estou tentando reproduzir o problema localmente e corrigi-lo. Eu configurei o contexto da primavera da seguinte forma:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost:3306/test?userUnicode=yes&amp;characterEncoding=UTF-8&amp"
    p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800"
    p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000"

/>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <value>
            hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
            hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            hibernate.default_schema=platform_server_original
            hibernate.show_sql=false
        </value>
    </property>
    <property name="mappingResources">
        <list>
            <value>sometables.hbm.xml</value>
        </list>
    </property>
</bean>

Então eu configurei meu mysql wait_timeout para 10 segundos, então executei meu teste, que é basicamente abrir uma conexão, fazer uma consulta, fechá-lo, então ele retorna ao pool, então dorme o thread por 15 segundos, e então abre uma conexão novamente , e faça uma consulta novamente, por isso vai quebrar. No entanto, recebi apenas um erro semelhante:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Falha no link de comunicação

Último pacote enviado para o servidor foi de 16 ms atrás.

Então, eu me pergunto se esses dois erros são os mesmos ou se são diferentes? Fiz algumas pesquisas e parece que os dois erros se resumiram à mesma solução: usar uma propriedade "testConnectionOnCheckout = true". No entanto, de acordo com o c3p0 doc, essa é uma verificação muito cara. Aconselha o uso de "idleConnectionTestPeriod", mas eu já estou configurando isso para 120 segundos. Qual valor devo usar para poder verificar corretamente a conexão ociosa?

Então eu basicamente pergunto duas coisas: 1. Como eu reproduzo o erro que obtive no código de produção? 2. como faço para corrigir isso?

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion