javascript - Le résultat est différent du résultat deviné lors d'un accès simultané à Node
怪我咯
怪我咯 2017-06-22 11:54:23
0
1
797
  • 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 !

.
怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(1)
某草草

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal