Reproduisez com.mysql.jdbc.exceptions.jdbc4.CommunicationsException avec une configuration de Spring, Hibernate et C3P0

J'ai eu cette erreur provenant de la production de code:

com.mysql.jdbc.des exceptions.jdbc4.CommunicationsException:
Le dernier paquet reçu avec succès
à partir du serveur was36940 secondes
il ya.Le dernier paquet envoyé avec succès
le serveur a été 36940, quelques secondes auparavant,
qui est plus long que le serveur
valeur configurée de 'wait_timeout'.
Vous devriez expirant
et/ou des tests de validité des connexions de
avant de l'utiliser dans votre application,
l'augmentation du serveur configuré
les valeurs pour le client, les délais d'attente, ou à l'aide de
le Connecteur/J propriétés de connexion
'autoReconnect=true' pour éviter cela
problème.

Et maintenant, je vais essayer de reproduire le problème localement et de le corriger. J'ai installé le printemps contexte comme suit:

<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>

Puis j'ai mis mon mysql wait_timeout à 10 secondes, puis exécuter mon test, qui est en fait d'ouvrir une connexion, procédez à une requête, fermez-la, afin qu'elle retourne à la piscine, puis le sommeil le fil pendant 15 secondes, puis l'ouvrir de nouveau, et faire une requête, donc il va se casser. Cependant, j'ai eu une erreur similaire seulement:

com.mysql.jdbc.des exceptions.jdbc4.CommunicationsException:
Défaillance du lien

Dernier paquet envoyé au serveur a été 16
ms il y a.

Donc je me demande ce sont ces deux erreurs de la même façon, ou qu'ils sont différents? J'ai fait quelques recherches, et il semble que les deux erreurs descendit à la même solution: l'utilisation d'une propriété "testConnectionOnCheckout=true". Toutefois, selon c3p0 doc, c'est un très coûteux vérifier. Il conseille l'utilisation de "idleConnectionTestPeriod", mais je suis déjà en le définissant à 120 secondes. Quelle valeur dois-je l'utiliser afin de pouvoir vérifier la connexion inactive?

Donc je suis fondamentalement de demander deux choses:
1. comment puis-je reproduire l'erreur que j'ai obtenu dans le code de production?
2. comment puis-je résoudre ce problème?

Merci!

source d'informationauteur fei