为什么在go sql包中使用准备好的语句而不是Query/Exec?

为什么在go sql包中使用准备好的语句而不是Query/Exec?,sql,go,Sql,Go,在go包中,我理解每个语句都应该在执行后关闭。 为什么有人会使用准备好的语句而不仅仅是原始的查询或执行方法?准备好的语句已经绑定到DB的具体连接,包含低级驱动程序.Stmt,并且可以由多个go Routing并发使用。因此,它的准备和使用非常方便,而且工作速度更快。我认为最好的答案来自维基百科上的文章 引述: 因此会产生编译和优化语句的开销 只执行一次,尽管语句执行多次。不是全部 可以在编写语句时执行优化 编译,有两个原因:最好的计划可能取决于具体的 参数值和最佳计划可能会随着表格和 索引会随时

在go包中,我理解每个语句都应该在执行后关闭。
为什么有人会使用准备好的语句而不仅仅是原始的
查询
执行
方法?

准备好的语句已经绑定到DB的具体连接,包含低级驱动程序.Stmt,并且可以由多个go Routing并发使用。因此,它的准备和使用非常方便,而且工作速度更快。

我认为最好的答案来自维基百科上的文章

引述:

因此会产生编译和优化语句的开销 只执行一次,尽管语句执行多次。不是全部 可以在编写语句时执行优化 编译,有两个原因:最好的计划可能取决于具体的 参数值和最佳计划可能会随着表格和 索引会随时间而变化。`在此处输入代码

准备好的语句能够抵抗SQL注入,因为 参数值,稍后使用不同的 协议,不需要正确转义。如果原始声明 模板不是从外部输入派生的,SQL注入无法 发生


我想你只能用一次事先准备好的声明。罗伯特·扎伦巴:你可以多次甚至同时使用事先准备好的语句。通常延迟stmt.Close()。您希望仅在事务中显式关闭stmt,这是一种特殊的行为。我想我需要在使用后使用
close
语句来释放连接。那么,语句在
Close
之后工作吗?IIUC——我可以声明一些“全局”语句,并一直使用它们;每次使用后,我应该
关闭
,然后我可以再次使用它们(即使同时使用?)。您不能使用closed stmt,这将返回一个错误。您可以一直使用准备好的stmt,然后在不需要时关闭它。关闭stmt将释放资源并将连接返回到连接拉取。Tx是特例-事务中准备的stmt属于事务,必须在Tx.OK中关闭,所以我不应该执行全局语句并在程序生命周期中使用它们。