19 votes

Quelle est la différence entre autoReconnect et autoReconnectForPools dans MySql connector/J?

Dans la référence de configuration pour le pilote connecteur J de MySql, un avertissement est émis sur l'utilisation de la propriété autoReconnect. J'ai suivi les instructions et augmenté le wait_timeout de mon serveur. Comme j'utilise DBCP (je considère passer à c3po après avoir lu plusieurs publications sur Stackoverflow critiquant DBCP), est-il possible d'utiliser la propriété autoReconnectForPools ? Que fait-elle exactement lorsqu'elle est activée sous DBCP ou tout autre pool de connexions ?

16voto

David Rabinowitz Points 14133

AutoReconnect lancera une SQLException au client, mais essaiera de rétablir la connexion.

autoReconnectForPools essaiera de pinguer le serveur avant chaque exécution SQL.

J'ai eu beaucoup de problèmes avec dbcp dans le passé, surtout des déconnexions. La plupart ont été résolus en passant à c3p0. Notez que le driver mysql a un testeur de connexion pour c3p0 (com.mysql.jdbc.integration.c3p0.MysqlConnectionTester).

Vous pouvez également jeter un œil à ceci : Options de pooling de connexions avec JDBC : DBCP vs C3P0

9voto

rustyx Points 2722

La fonction autoReconnect de MySQL est obsolète, car elle présente de nombreux problèmes (réf : documentation officielle).

autoReconnectForPools n'a que peu à voir avec autoReconnect, il est plus lié à autoCommit et reconnectAtTxEnd - lorsque les 3 sont true, il enverra un ping au serveur à la fin de chaque transaction et se reconnectera automatiquement si nécessaire.

La validation de la connexion de DBCP est imparfaite - même lorsque testOnBorrow est configuré, il arrive parfois que des connexions cassées soient renvoyées depuis le pool (sans parler du fait qu'il est très inefficace de tester une connexion avant chaque emprunt).

Conformément à cet article, HikariCP semble être une meilleure implémentation de pool, car il est capable d'utiliser l'API JDBC4 isValid() qui est beaucoup plus rapide que d'exécuter une requête de test, et est spécialement conçu pour ne jamais renvoyer de connexions cassées à l'application cliente.

2voto

StatsTrade Points 31

Es-tu sûr de bien utiliser DBCP ?

Selon les notes de configuration courtes, il est censé gérer assez bien les timeouts grâce à la valeur par défaut de testOnBorrow=true (teste la connexion avant son utilisation, et si elle échoue, elle est retirée du pool et nous essayons d'en obtenir une nouvelle à la place).

La seule chose que tu dois faire est de t'assurer que tu configures la propriété validationQuery avec une chaîne non nulle, par exemple "SELECT 0" pour la base de données MySQL (ici est un billet sur les différentes valeurs de validationQuery par BD utilisée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X