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

我有一些 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

}


守着一只汪
浏览 86回答 1
1回答

繁花如伊

正如文档所述DB.Prepare():多个查询或执行可以从返回的语句同时运行。尽管预准备语句的预期用途不是在多个请求之间共享它们,但并发使用是安全的。主要原因是准备好的语句(可能)在数据库服务器本身中分配资源,并且在调用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)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go