Nœud-Mysql jeter délai d'attente de connexion
Mon node.js app donne 5xx en raison de délais d'attente de connexion à des moments aléatoires. Voici comment je me connecte et requête:
var mysql = require('mysql');
var config = {
host: '172.10.1.1',
port: 3306,
user: 'user',
password: 'pwd',
database: 'mydb',
connectionLimit: 15,
queueLimit: 30
}
var poolCluster = mysql.createPool(config);
var queryDB = function(query, cb) {
poolCluster.getConnection(function(err, connection) {
if(err) {
cb(err, null);
}
else {
connection.query(query, function (err, rows) {
connection.release();
cb(err, rows);
});
}
});
};
Aussi, dans une autre version alternative, avec le regroupement de connexion désactivée, le code ressemble à ceci:
queryDB = function(query, cb) {
var connection = mysql.createConnection(config);
connection.query(query, function(err, rows) {
connection.end();
cb(err, rows);
});
};
Mais les deux configurations de donner
Erreur: connexion ETIMEDOUT
lors de la Connexion._handleConnectTimeout
Un projet similaire pour mon installation actuelle peut être vu ici: https://github.com/hay-wire/NodeBootstrap/blob/master/models/UsersUtils.js
Ce serait génial si tu pouvais préciser ce qui pourrait mal se passer avec les connexions. Merci.
Mise à JOUR
Depuis le node.js le service était en cours d'exécution en mode cluster, j'ai pensé que peut-être une condition de course à travers les fils à acquérir mysql ressource de connexion de la connexion partagée de la piscine est la raison. J'ai donc éteint le mode de cluster à un seul thread de mode et les délais de connexion arrêté.
Encore je ne suis pas convaincu que c'était la condition de la course à l'origine de ce problème. Aucune façon de vérifier cela?
Le temps est très moins.. à propos de quelques millisecondes
Bonjour, j'ai un problème similaire, est elle aussi liée à une augmentation de la CPU problème?
OriginalL'auteur Haywire | 2015-09-22
Vous devez vous connecter pour publier un commentaire.
Cela n'a rien à voir avec le délai d'attente. J'ai remarqué que le suivant (si vous l'utilisez dans quelque chose comme AWS Lambda fonctions, je pense que cela s'applique également à de nombreuses situations avec des rappels).
Vous appelez le
connection.end();
avant qu'il envoie le COM_QUIT paquet au serveur MySQL pour fermer la connexion. Alors la prochaine fois que vous venez d'importervar mysql = require('mysql');
(dans mon cas au moins) qu'il va jeter une erreur de dépassement de délai que la précédente connexion semble toujours ouvert sur votre machine, mais a en fait été fermé par MySQL.Veuillez voir ce lien directement à partir de la documentation sur l'interruption des connexions
Donc pour corriger cet état d'utilisation
.destroy()
au lieu de.end()
.D'autres de l'utilisation rationnelle
.end()
correctement avec un rappel comme dans:OriginalL'auteur DR.
Qui arrive de temps en temps, la valeur par défaut acquireTimeout est un peu faible (10000ms), de sorte que vous devrait augmenter si vous avez plusieurs connexions en cours d'exécution. Vous pouvez le mettre dans vos options de connexion avec
Bonne question, il y a une longue discussion sur github avec pas de vraie réponse. Je dirais que cela peut être dû à la latence du réseau, ou quoi que ce soit. @détraque. Je suis l'aide d'un noeud-mysql avec un 5000 pool de connexions et de ne pas courir sur la question depuis que j'ai augmenté le délai d'attente. J'ai alors cessé d'essayer de trouver une réponse sur le pourquoi...
Lol! Btw êtes-vous en utilisant le mode cluster avec node.js ou mono-thread mode? PS: j'ai mis à jour la question dans cette référence.
L'ensemble de l'application en cluster, mais de ne pas utiliser la piscine de clustering @détraque
OriginalL'auteur bambam