为什么 rows.Next() 取决于数据库响应率?

我正在使用sqlx,pgx和postgresql. 有两个数据库。第一个 - 基于VPS服务器(慢速),第二个 - 安装locally在我的 PC 上(快速)。我对此代码有疑问:


var ordersSlice []OrdersModel    

start := time.Now()

query = `select * from get_all_orders();`

rows, err = db.Queryx(query)

log.Printf("Query time %s", time.Since(start)) // avg in slow DB - 62ms, avg in fast DB - 20ms


if rows == nil || err != nil {

    fmt.Println(err)

    fmt.Println("no result")

    response.WriteHeader(http.StatusInternalServerError)

    return

}


// db.Close() to check if rows.Next() depends on DB

start = time.Now()

for rows.Next() {

    var order OrdersModel


    err = rows.StructScan(&order)

    if err != nil {

        fmt.Println(err)

    }

    ordersSlice = append(ordersSlice, order)

}

log.Printf("Sturct scan time %s", time.Since(start)) // avg in slow DB - 14.4S, avg in fast DB - 9ms

我的意思是比使用慢速数据库rows.Next()需要更多时间。处理结果db.Queryx(query)需要14.4 秒。为什么这样?带有 , 的代码的第一部分db.Queryx(query)应该取决于数据库响应率。正如我所看到的,它db.Queryx(query)应该取决于数据库响应率,因为查询在这里执行并且结果放在rows. 在 中rows.Next(),结果只是被处理。当我假设rows.Next()以某种方式依赖于 DB 时,我在row.Next()循环执行之前以这种方式关闭了连接db.Close()。但是没有错误。记录被处理。


Cyclefor rows.Next()不与 DB 通信,为什么它取决于 DB 响应率?


慕运维8079593
浏览 195回答 1
1回答

开满天机

简短的回答是:是的,Rows.Next()与 DB 通信。来自database/sql文档:行是查询的结果。它的游标在结果集的第一行之前开始但是,实际上,实现细节留给了 DB 驱动程序。例如, inlib/pq执行Query 简单查询或扩展查询协议(有关详细信息,请参阅postgres 文档RowDescription),并在接收到对象后,将其解析为内部结构(rowHeader)。然后,rows.Next()使用它来获取实际数据。你可以看到,它pgx做了类似的事情。Query方法执行协议之一并从结构RowDescription中保存数据。ResultReader然后rows.Next使用它从数据库中获取数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go