亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《为什么 rows.Next() 取决于数据库响应率?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《为什么 rows.Next() 取决于数据库响应率?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容我正在使用 sqlx
、pgx
和 postgresql
。有两个 db。第一个 - 基于 vps
服务器(较慢的一个),第二个 - 在我的 pc 上安装 locally
(较快的一个)。我对这段代码有疑问:
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()
在某种程度上依赖于数据库时,我在 row.next()
循环执行之前关闭了连接,这样 db.close()
。但没有出现错误。记录已处理。
cycle for rows.next()
不与数据库通信,那么为什么它取决于数据库响应率?
简短的回答是:是的,rows.Next()
与数据库通信。
来自 database/sql
文档:
行是查询的结果。它的游标在结果集的第一行之前开始
但是,实际上,实现细节留给了数据库驱动程序。
例如,在lib/pq
中,Query
executes either simple query or extended query protocol(更多详细信息请参阅postgres docs),在收到RowDescription
对象后,它将其解析为内部结构(rowHeader
)。然后,rows.Next()
使用它到 fetch actual data。
您可以看到,pgx
做了类似的事情。 Query
方法 executes one of protocols 并将 RowDescription
中的数据保存在 ResultReader
结构中。然后rows.Next
使用它从DB中获取数据。
今天关于《为什么 rows.Next() 取决于数据库响应率?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!
--结束END--
本文标题: 为什么 rows.Next() 取决于数据库响应率?
本文链接: https://www.lsjlt.com/news/596858.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0