sql - 是否可以为多个请求准备一次 SQL 语句?

标签 sql go prepared-statement

我有一些 SQL 查询,它们不会随每个请求而改变(仅其参数)。因此,不要对每个请求都执行此操作:

func HandleRequest() {
    rows, err := db.Query(sqlQuery, params...)
    // do something with data
}

如果我对每个请求都这样做,可以吗:

// together with server initialization
stmt, err := db.Prepare(sqlQuery)

func HandleRequest() {
    rows, err := stmt.Query(params...)
    // do something with data
}

最佳答案

作为 DB.Prepare() 的文档状态:

Multiple queries or executions may be run concurrently from the returned statement.

并发使用是安全的,尽管预准备语句的预期用途不是在多个请求之间共享它们。主要原因是准备好的语句(可能)在数据库服务器本身中分配资源,并且在调用返回语句的 Close() 方法之前它不会被释放。所以我建议不要这么做。

典型的用例是,如果您必须使用不同的参数多次运行相同的语句,例如文档中的示例:

projects := []struct {
    mascot  string
    release int
}{
    {"tux", 1991},
    {"duke", 1996},
    {"gopher", 2009},
    {"moby dock", 2013},
}

stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close() // Prepared statements take up server resources and should be closed after use.

for id, project := range projects {
    if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil {
        log.Fatal(err)
    }
}

关于sql - 是否可以为多个请求准备一次 SQL 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064081/

相关文章:

java - ResultSet 的 Oracle JDBC 性能

java - Hive 2 JDBCPreparedStatement 抛出错误无法识别表达式规范中 '?' '<EOF>' '<EOF>' 附近的输入

sql-server - 我的 SQL 有什么问题吗? (找到 "previous"的记录)

go - 如何遍历文件但跳过一个特定的文件名

go - 使用 go run 的路径不适用于 go install/从 bin 调用可执行文件

shell - 使用go获取 shell 名称

php - Insert_id 在下一个准备好的语句中直接使用时为 null

php - 将两个 mysql 查询合并为一个

mysql - 外键的语法差异 MySQL/PostgresQL

c# - 将变量值和输出从 PL/SQL 代码块返回到 C#