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&characterEncoding=UTF-8&"
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!