La logique du test est relativement simple, c'est-à-dire que Node accède à la base de données pour interroger les données. Le temps d'exécution de l'instruction SQL est d'environ 2 secondes. J'ai utilisé JMeter pour effectuer des tests multithreads (5 threads). les résultats attendus (selon les caractéristiques non bloquantes de Node), ça devrait l'être. Ce sont 5 threads qui renvoient le résultat en 2 secondes en même temps, mais le résultat est comme ceci :
Selon les résultats, Node est exécuté en série. Ceci n'est pas cohérent avec le résultat attendu. Quelqu'un peut-il l'expliquer
Code :
app.get('/', function (req, res) {
var now = +(new Date())
connection.query('select count(*) from ACTIVITY group by name', function (err, result, fields) {
var curr = +(new Date())
var tmp = '耗时:' + (curr - now)
console.log(tmp)
res.send(tmp)
})
})
Remarque : ce n'est pas un problème de traitement de base de données, car j'utilise deux machines différentes pour exécuter la même instruction SQL, et le temps est de 2 secondes
Les éléments suivants sont des suppléments
Selon @biancheng, la raison est que plusieurs instructions SQL utilisent la même connexion. Maintenant, le code a été modifié et le pool de connexions à la base de données est utilisé. Le résultat de l'exécution est le suivant :
Le code est le suivant :
app.get('/', function (req, res) {
var now = +(new Date())
pool.getConnection(function (err, conn) {
console.log('--连接池连接成功!' + +(new Date()))
conn.query('select count(*) from ACTIVITY group by name', function (err, result, fields) {
var curr = +(new Date())
var tmp = '耗时:' + (curr - now)
console.log(tmp)
res.send(tmp)
})
})
})
Ce résultat est plus conforme aux attentes. Cinq threads interrogent en même temps, et tous les temps de retour sont de 4s+. À mesure que la pression augmente, le temps d'interrogation deviendra naturellement plus long après le test, lorsque les threads passeront à 2, le délai de retour est de 2s+, conforme aux attentes !
Le début de l'heure est avant la requête et la fin est lorsque la requête est terminée, donc chaque fois est l'heure à laquelle la requête est en cours d'exécution,
Le nœud est asynchrone, mais vous utilisez la même connexion. La connexion elle-même doit-elle être mise en file d'attente ? Autant que je sache, le SQL exécuté par la plupart des bases de données dans la même connexion est mis en file d'attente et exécuté l'un après l'autre... Plusieurs connexions peuvent être parallèles.