为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕运维8079593 2022-05-23 16:51:02
我正在使用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 - 20msif 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 DBstart = 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 响应率?
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

简短的回答是:是的,Rows.Next()与 DB 通信。

来自database/sql文档:

行是查询的结果。它的游标在结果集的第一行之前开始

但是,实际上,实现细节留给了 DB 驱动程序。

例如, inlib/pq执行Query 简单查询或扩展查询协议(有关详细信息,请参阅postgres 文档RowDescription),并在接收到对象后,将其解析为内部结构(rowHeader)。然后,rows.Next()使用它来获取实际数据

你可以看到,它pgx做了类似的事情。Query方法执行协议之一并从结构RowDescription中保存数据。ResultReader然后rows.Next使用它从数据库中获取数据。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号