javascript - Node并发访问时与猜想的结果不致

查看:80
本文介绍了javascript - Node并发访问时与猜想的结果不致的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

  • 试验的逻辑比较简单, 就是Node访问数据库查询数据, SQL语句的执行时间在2秒左右, 我用JMeter进行多线程测试(5线程),按照预想的结果(根据Node非堵塞特性), 应该是5线程同时在2秒返回结果, 但是结果是这样的:

  • 按照结果来看, Node成串行执行了, 这和预想的结果完成不一致啊, 哪位能解释一下

  • 代码:

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)
    })
})

  • 注: 不是数据库处理的问题, 因为我用两台不同的机器, 执行相同的SQL语句, 时间都2秒


以下为补充

  • 按照@边城的原因是多条SQL语句用的同一个connection, 现在代码已修改, 使用的是数据库连接池, 执行结果如下图:

  • 代码如下:

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)
        })
    })
})

  • 这样的结果和预想就比较一致了, 5线程同时查询, 都是在4s+时间返回, 压力上去了, 查询时间自然会长, 经测试, 当线程改成2时, 返回的时间在2s+, 和预期也一致!

解决方案

时间起始是 query 之前,结束是 query 完成,所以每个时间是 query 运行的时间,

Node 是异步了,但是你用的是同一个 connection,connection 本身是不是需要排队呢?据我所知,多数数据库在同一个 connection 中执行的 SQL 都是排队挨个进行的……多个 connection 之间可能会并行。

这篇关于javascript - Node并发访问时与猜想的结果不致的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆