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&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>
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 lienDernier 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
Vous devez vous connecter pour publier un commentaire.
J'ai eu des problèmes similaires avec MySQL et un pool de connexion. Le problème, c'est vous dire le pool de connexion qu'après un délai d'inactivité de 30 minutes, mais la base de données de coupures de la connexion au bout de 10 secondes. Depuis votre connexion inactive période de contrôle est de 120 sec, ça laisse un peu moins de 110 secondes de la piscine pour utiliser une connexion interrompue!
J'avais utilisez les paramètres suivants pour la production:
À reproduire votre problème, définissez votre délai d'attente de connexion à votre serveur MySQL propriétés pour une valeur très faible, c'est à dire 2 ms, et l'exécution d'une requête connu pour avoir un long temps de traitement. Vous pouvez définir le délai d'attente des biens, soit dans la chaîne de connexion MySQL ou par l'intermédiaire d'une propriété, si vous êtes en utilisant les propriétés des fichiers de configuration de votre connexion JDBC. Vous pouvez consulter la Javadoc sur votre jaxax.sql.Connexion de source de données et la base de documentation pour les détails sur la façon de le faire.
Fei - pourrait être l'un des plusieurs choses, ne peut pas vraiment dire basée sur les informations affichées jusqu'à présent.
Vous suggérons d'ajouter MySQL/Spring/Hibernate/C3PO/JDBC numéros de version à votre question, dans le cas où il existe un problème connu là-bas.
La production message d'erreur est courante, avec de nombreuses causes possibles. Quelques pistes pour vous:
La production d'erreur peut indiquer
que votre demande n'est pas
libération d'une connexion de retour à l'
la piscine quand en fait, la prévention de
c3p0 de vérification. (Le c3p0
inactif contrôles ne peuvent être appliquées à
décoché-hors connexions).
Vérifier que c3p0 est vraiment de travail
(vous pouvez utiliser "vanilla"
les connexions si non). Dans votre test,
si vous définissez (par exemple) MySql
wait_timeout=10, l'application thread
sommeil=35, et
idleConnectionTestPeriod=30, si
la mise en commun est de travailler, à l'exception
devraient disparaître.
Sur la dépense de l'inactivité de vérifications:
envisager de ne pas utiliser la valeur par défaut
getTables() - peut-être mis
preferredTestQuery à quelque chose de pas cher(-er) 'SELECT 1" peut-être pour MySQL?