这是一个问题帖,直接举例子
如果有两条sql语句要执行
rows, err := db.Query("SELECT id, user_id, msg_send, add_time, order_id, pay, expo_id FROM `tp_order` WHERE status = 6")
if err != nil {
DebugLog.Println("GET ORDER DATA ERR", err)
}
defer rows.Close()
for rows.Next() {
...
}
rows, err = db.Query("SELECT xxx FROM xxx WHERE xxx")
if err != nil {
DebugLog.Println("GET ORDER DATA ERR", err)
}
for rows.Next() {
...
}
如上示例,rows先后被两次赋值
这样调用 defer rows.Close()
会不会导致泄露?
会.
看db.Query的底层调用函数
func (db *DB) queryDC(ctx, txctx context.Context, dc *driverConn, releaseConn func(error), query string, args []interface{}) (*Rows, error)
,每次返回的Rows都是一个全新的实例,其占用了一个driverConn(数据库连接), 不释放会导致泄露.