Le temps de connexion de problèmes après la période d'inactivité du
Nous avons une api qui utilise hibernate comme outil ORM et nous utilisons c3p0 que le pool de connexion gestionnaire. Nous n'avons pas de problèmes quand on est sous la charge. Cependant, nous sommes en cours d'exécution dans l'impossibilité d'obtenir une connexion" exceptions lorsque l'api a été inactif pendant un jour ou deux. Donc, si pas de corps utilise l'api sur le week-end, nous obtenons des erreurs de connexion, le lundi matin.
Causés par: java.sql.SQLException: Une tentative de la part d'un client à la caisse d'une Connexion a expiré.
Nous utilisons mysql comme base de données. Sur mes recherches, j'ai appris à connaître que mySQL rend les connexions obsolètes au bout de 8 heures environ. Il pourrait être possible que le pool de connexions est de donner un état de la connexion au client et, partant, le délai de connexion des exceptions pour le client.
À l'heure actuelle, nous n'avons pas de test de la connexion configurée dans C3Po. Disons que, si j'utilise IdleTestPeriod pour tester la connexion avant qu'ils soient remis au client par la piscine. Puis ce qui se passe si toutes mes connexions échouent à l'épreuve lors d'un point de temps? Ces connexions échouées être retirés de la piscine et de nouvelles connexions actives être généré à nouveau?
Actuellement, c'est le c3p0 paramètres que nous utilisons. Toutes les autres raisons possibles pour ce problème?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${ ---- }"/>
<property name="jdbcUrl" value="${ ---- }"/>
<property name="user" value="${ ---- }"/>
<property name="password" value="${ ------ }"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5" />
<property name="maxPoolSize" value="125" />
<property name="maxStatements" value="10" />
<property name="maxIdleTime" value="180" />
<property name="maxIdleTimeExcessConnections" value="30" />
<property name="checkoutTimeout" value="3000" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>
Vous devez vous connecter pour publier un commentaire.
Si vous avez un checkoutTimeout de 3 secondes (3000 msecs) ensemble. C'est l'Exception que vous vous voyez. Les Clients ne sont autorisés qu'à attendre trois secondes pour passer à la caisse une Connexion à partir de la piscine; si trois secondes n'est pas assez, qu'ils voient vos Exception.
La question est, pourquoi les clients sont-ils pris tant de temps pour obtenir une Connexion? Normalement, la vérification d'un point de Connexion est assez rapide. Mais si toutes les Connexions sont vérifiés, les clients ont à attendre (lente) de la Connexion de l'acquisition de la base de données.
Vous avez de votre piscine configuré pour assez agressive à l'abattage de Connexions. N'importe quel nombre de Connexions ci-dessus minPoolSize=5 seront détruites si elles sont inactives pour plus de maxIdleTimeExcessConnections=30 secondes. Pourtant, votre piscine est configuré pour à grande échelle éclate: maxPoolSize=125. Supposons que votre application est tranquille pour un moment, puis il reçoit une rafale de demandes de Connexion des clients. La piscine seront rapidement épuisés de Connexions et de commencer à acquérir des éclats de acquireIncrement=5. Mais si il y a soudain 25 clients et la piscine est à seulement 5 Connexions, il n'est pas improbable que le 25e client peut de temps avant l'acquisition d'une Connexion.
Il ya beaucoup que vous pouvez faire. Ces réglages sont séparables, vous pouvez les mélanger ou les match que vous voyez l'ajustement.
Abattage d'inactivité "excès" de Connexions, moins agressive, de sorte que, en général, l'eau de votre piscine a une certaine capacité à absorber les pointes de trafic de la demande. Vous pouvez déposer maxIdleTimeExcessConnections entièrement, et de laisser les Connexions lentement dépérir après maxIdleTime=180 secondes d'inactivité. (À la baisse? Une plus grande empreinte ressources pour pendant de plus longues périodes d'inactivité.)
Ensemble minPoolSize à une valeur plus élevée, de sorte qu'il est peu probable que la piscine va voir une explosion de l'activité pour laquelle il a trop peu de Connexions. (À la baisse? Plus grande ressource permanente de l'empreinte.)
Baisse checkoutTimeout de votre config. c3p0 par défaut est de permettre aux clients d'attendre indéfiniment pour une Connexion. (À la baisse? Peut-être que vous préférez clients rapidement un échec, plutôt que d'attendre le succès possible.)
Je ne pense pas que le problème que vous observez, a beaucoup à voir avec le test de la Connexion ou MySQL délais d'attente en soi, mais cela ne signifie pas que vous ne devriez pas régler ces questions. Je m'en remets à nobeh de donner des conseils sur la base de la reconnexion de problème. (Je ne suis pas un grand utilisateur de MySQL.) Vous devriez envisager la mise en œuvre de test de la Connexion. Vous avez un preferredTestQuery, de sorte que les tests doivent être assez rapide. Mon habitude est d'utiliser testConnectionOnCheckin et idleConnectionTestPeriod. Voir http://www.mchange.com/projects/c3p0/#configuring_connection_testing
Bonne chance!
Dans la section de de Haute disponibilité et de clustering dans MySQL Java Connector, prendre un coup d'oeil à l'propriétés; en particulier
autoReconnect
etautoReconnetForPools
.Utiliser les propriétés de votre connexion JDBC URL.
Ils m'ont aidé avant lors de l'utilisation de MySQL, Hibernate, et C3P0. Espérons que cela aide.