我正在使用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
使用它从数据库中获取数据。
- 1 回答
- 0 关注
- 194 浏览
添加回答
举报
0/150
提交
取消