Question
Je travaille sur une application qui utilise un pool de connexion à Apache Tomcat pour communiquer avec MySQL. Je me demandais pourquoi voudriez-vous utiliser un plus petit wait_timeout que la valeur par défaut de 28 800 secondes? Je vois beaucoup de malsides pour réduire le délai d'attente, mais quels sont les majuscules?
arrière-plan
Le paramètre wait_timeout est défini comme
Le nombre de secondes que le serveur attend l'activité sur une connexion non interactive avant de la clôturer.
problème
Si je fais la serviette trop petite, MySQL tue les connexions toujours valides dans le pool de connexion, mon application Web utilise. Dans ma situation, je suis la seule personne en utilisant actuellement la demande à tout moment, donc naturellement, la connexion de base de données ne va pas au ralenti lorsque je ne le teste pas. Je pourrais résoudre ce problème en étendant simplement le wait_timeout sur MySQL à quelque chose de très grand afin que même si je suis loin de mon bureau pendant 2 semaines, la piscine ne retourne jamais une connexion morte.
Vous devriez être juste bien étendue wait_timeout
Notez la valeur maximale pour wait_timeout pour mysql 5.0 , ==, 5.1 , 5.5 , 5.6 Englisons
Ces maximums n'existeraient pas de MySQLD ne pouvaient pas les gérer.
La mise en commun de la connexion ne fait que gagner sur la tête en termes d'alternative: Détruire et réaffecter la mémoire pour les nouvelles connexions de DB. Cela pourrait causer que le système d'exploitation sur le serveur DB s'engage dans beaucoup plus d'échange pour jongler à la mémoire.
J'ai écrit à ce sujet il y a plus d'un an: À quel point l'ouverture et la fermeture d'une connexion DB sont coûteuses ?
L'abaissement du wait_timeout pourrait définitivement jeter Apache dans la confusion car il y a des objets PHP et apache pour les connexions de DB toujours instanciées, tandis que la connexion DB décide de se terminer tôt et sans avertissement. Dans cet événement, vous devrez peut-être scanner votre netstat
pour tout TIME_WAIT
Sur les connexions via le port 3306 ou tout autre port MySQL utilise.
May 20, 2011
: Pourquoi la mise en cache MySQL est-elle sur notre site dynamique PHP ?Aug 17, 2011
: Trop de connexionsOct 26, 2011
: Qu'est-ce qui pourrait causer des délais d'attente de requête étranges entre PHP et mysql ? ] ==Feb 27, 2012
: la connexion MySQL compte beaucoup plus grand que le nombre de requêtesSi tel existe et empêche Apache d'ouvrir une nouvelle connexion, vous devrez tuer le temps_waits vous-même. Voir mon Feb 01, 2012
Serverfault Post MySQL Abaissement de la valeur Wait_Timeout pour réduire le nombre de connexions ouvertes sur la façon de le faire.
Supposons que vous ayez une application Web sans mise en commun de la connexion.
Supposons maintenant que votre application Web fuit des connexions (ne les ferme pas correctement - par exemple: en n'utilisant pas enfin les blocs en Java). Les connexions qui fuient sont beaucoup plus problématiques avec une longue attente d'attente (la valeur par défaut est 8 heures). L'application s'exécutera rapidement de connexions (erreur "Trop de connexions" de MySQL).
Dans une application Web typique, une connexion est ouverte et fermée toutes dans le cadre d'une seule demande HTTP. Donc, aucune connexion ne doit être nécessaire pour plus de quelques secondes. En réduisant le délai d'attente, vous devriez être capable d'éliminer un problème de "trop de connexions" sans avoir à corriger le code.
Avec cela, la solution correcte doit toujours passer à travers un correction du code pour éliminer les connexions qui fuient.
ne pas tester du tout est l'approche la plus rapide, pas nécessairement le plus évolutif et presque jamais le meilleur. Notez que les documents que vous consultez recommandés pour des tests occasionnels de connexions inactives, même pour les applications qui donnent la priorité à la rapidité sur la fiabilité de la connexion: "Réglage d'une assez longue idleConnectionTestPeriod
et de ne pas tester à la caisse et l'enregistrement du tout est un excellente approche hautement performante. "
assez longtemps pourrait être aussi peu que 300 secondes, à moins que votre piscine soit très grande. (Un test de connexion prend sur l'ordre d'un milliseconde, de sorte que les frais généraux de Say 50 toutes les 5 minutes sont très faibles, en particulier si vous définissez une efficacité preferredTestQuery
, que vous devriez (essayer SELECT 1
sur mysql.)
c3P0 vous donne beaucoup d'outils pour traiter des délais de connexion - tout schéma de test de connexion purgera des connexions chronométrées ou vous pouvez simplement utiliser les paramètres de configuration maxIdleTime
ou maxConnectionAge
si vous préférez ne pas tester.