我正在使用golang和阅读本文档的 mysql .它说
尽管在完成数据库时Close()数据库是惯用的,但sql.DB对象的设计是长期存在的.不经常打开()和关闭()数据库.
我不知道连接应该有多长时间.现在,如有必要,我会打开每个http请求的连接.太频繁了吗?
Iam*_*NaN 14
在同一份文件的下面是:
而是为您需要访问的每个不同数据存储创建一个sql.DB对象,并保留它直到程序完成访问该数据存储.根据需要传递它,或者以某种方式在全球范围内提供它,但保持打开状态.并且不要从短期函数中打开()和关闭().相反,将sql.DB作为参数传递给该短期函数.
如果不将sql.DB视为长期存在的对象,则可能会遇到诸如重用和连接共享不良,可用网络资源不足或偶发故障等问题,因为TIME_WAIT中存在大量TCP连接状态.这些问题表明你没有像设计那样使用数据库/ sql.
打开和关闭数据库连接是一项代价高昂的操作,因此您希望尽可能避免这种情况.你肯定不想在每次请求后关闭连接(除非每天只有几个,即使这样,只要应用程序运行,你就可以保持打开状态)
database/sql包使用连接池,因此您不必担心管理多个连接.
没有权威的答案,因为它取决于您使用的驱动程序.如果你使用的是:
...那么你根本不应该关闭你sql.DB.在sql.DB这些情况下,代表一个连接池,并在处理器/请求/功能,使用它你只是用从池(如果可用)的连接手段.
例如
var db *sql.DB
func setup() error {
var err error
db, err = sql.Open(...)
if err != nil {
log.Fatal(err)
}
// Other setup-related activities
}
func main()
err := setup()
if err != nil {
log.Fatal(err)
}
// No need to call `defer db.Close()` here
http.ListenAndServe(...)
}
func SomeHandler(w http.ResponseWriter, r *http.Request) {
u := User{}
res, err := db.GetThings(&u)
// No need to close this here - it's just a connection dynamically pulled
// from our sql.DB connection pool in most cases
}
Run Code Online (Sandbox Code Playgroud)