lorsque j'utilise le nœud mysql, une erreur apparaît entre 12h00 et 2h00 indiquant que la connexion TCP est arrêtée par le serveur. Voici le message complet:
Error: Connection lost: The server closed the connection.
at Protocol.end (/opt/node-v0.10.20-linux-x64/IM/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
Voilà la solution . Cependant, après avoir essayé de cette manière, le problème apparaît également. maintenant je ne sais pas comment faire. Quelqu'un rencontre-t-il ce problème?
Voici comment j'ai écrit suivre la solution:
var handleKFDisconnect = function() {
kfdb.on('error', function(err) {
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
console.log("PROTOCOL_CONNECTION_LOST");
throw err;
}
log.error("The database is error:" + err.stack);
kfdb = mysql.createConnection(kf_config);
console.log("kfid");
console.log(kfdb);
handleKFDisconnect();
});
};
handleKFDisconnect();
mysql
node.js
dbconnection
jackieLin
la source
la source
Je ne me souviens pas de mon cas d'utilisation d'origine pour ce mécanisme. De nos jours, je ne peux penser à aucun cas d'utilisation valable.
Votre client devrait être en mesure de détecter la perte de la connexion et de vous permettre de recréer la connexion. S'il est important qu'une partie de la logique du programme soit exécutée à l'aide de la même connexion, utilisez des transactions.
tl; dr; N'utilisez pas cette méthode.
Une solution pragmatique consiste à forcer MySQL à maintenir la connexion active:
setInterval(function () { db.query('SELECT 1'); }, 5000);
Je préfère cette solution au pool de connexions et à la gestion de la déconnexion car elle ne nécessite pas de structurer votre code de manière à tenir compte de la présence de la connexion. Faire une requête toutes les 5 secondes garantit que la connexion restera active et
PROTOCOL_CONNECTION_LOST
ne se produira pas.En outre, cette méthode garantit que vous gardez la même connexion active , par opposition à la reconnexion. C'est important. Considérez ce qui se passerait si votre script s'appuyait
LAST_INSERT_ID()
et que la connexion mysql avait été réinitialisée sans que vous en soyez conscient?Cependant, cela garantit uniquement que le délai de connexion (
wait_timeout
etinteractive_timeout
) ne se produit pas. Il échouera, comme prévu, dans tous les autres scénarios. Par conséquent, assurez-vous de gérer les autres erreurs.la source
Pour simuler une connexion interrompue, essayez
connection.destroy();
Plus d'informations ici: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
la source
la meilleure solution est d'utiliser la piscine - mal gérer cela pour vous.
const pool = mysql.createPool({ host: 'localhost', user: '--', database: '---', password: '----' }); // ... later pool.query('select 1 + 1', (err, rows) => { /* */ });
https://github.com/sidorares/node-mysql2/issues/836
la source
Créer et détruire les connexions dans chaque requête peut être compliqué, j'ai eu des maux de tête avec une migration de serveur lorsque j'ai décidé d'installer MariaDB à la place de MySQL. Pour une raison quelconque, dans le fichier etc / my.cnf, le paramètre wait_timeout avait une valeur par défaut de 10 s (cela fait que la persistance ne peut pas être implémentée). Ensuite, la solution a été mise en 28800, soit 8 heures. Eh bien, j'espère aider quelqu'un avec cette "güevonada" ... excusez-moi pour mon mauvais anglais.
la source