gpt4 book ai didi

go - 在Go中通过语句或数据库使用QueryRow

转载 作者:行者123 更新时间:2023-12-01 22:15:44 25 4
gpt4 key购买 nike

下面的查询执行方法在DB中发出完全相同的查询(共3个),这很好而且可以理解-参见下文。但是,我想知道的是,就Go而言,两者在内存,cpu,缓存,连接用法等方面是否存在真正的区别?

查询

2020-02-22T12:29:23.858393Z 41 Prepare SELECT id, uuid, name FROM users WHERE id = ?
2020-02-22T12:29:23.859601Z 41 Execute SELECT id, uuid, name FROM users WHERE id = 1
2020-02-22T12:29:23.861607Z 41 Close stmt

方法

func Select1(query string, args ...interface{}) (*sql.Row, error) {
stmt, err := DB.Prepare(query)
if err != nil {
return nil, err
}
defer stmt.Close()

return stmt.QueryRow(args...), nil
}

func Select2(query string, args ...interface{}) *sql.Row {
return DB.QueryRow(query, args...)
}

最佳答案

除了@mkopriva在有关客户端的注释中所说的以外,使用准备好的语句还涉及服务器端。

重要的是要注意,使用*sql.DB使用connection pooling:

DB是代表零个或多个基础池的数据库句柄
连接数

为什么这很重要?良好的并发访问可能会触发多个物理连接。并且当使用准备要被重用的语句时-仅在用于同一数据库 session (即连接)时才有效。

连接池(使用*sql.DB)本质上不能保证这一点。因此,使用100个并发查询-理论上可能会生成100个并发数据库连接-不是一个-但是在服务器端最多可以有100个准备好的语句。

您可以通过sql.DB.Conn()获得与数据库的单个连接,其中:

在同一Conn上运行的查询将在同一数据库 session 中运行。

意味着任何先前生成的预处理语句都将获得重用的好处(因为它们使用相同的“ session ”)。

总之,权衡准备好的语句对客户端和服务器的影响,以及您是否实际上通过并发使用获得了这些好处。

关于go - 在Go中通过语句或数据库使用QueryRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com