为什么推迟stmnt.Close()似乎阻止了我的http.Redirect?

时间:2015-09-04 00:39:36

标签: go

为什么我的defer stmnt.Close()似乎阻止了我的http.Redirect重定向,只是挂在无限尝试加载的网站上。

但如果我删除defer stmnt.Close()它重定向就好了吗?

    err = db.QueryRow("SELECT steamid FROM accounts WHERE steamid = ?", ids).Scan(&steamid)
    if err != nil {
        common.WriteLog(err.Error(), r)
        http.Error(w, "Failed to connect to database. Try again in a bit.", 500)
    }

    switch {
    case len(profile.Response.Players) == 0:
        common.WriteLog("Failed to look you up in the steam database. Try again in a bit.", r)
        http.Error(w, "Failed to look you up in the steam database. Try again in a bit.", 500)
    case err == sql.ErrNoRows:
        stmnt, err := db.Query("INSERT INTO accounts SET steamid=?", ids)
        if err != nil {
            common.WriteLog(err.Error(), r)
            http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)
        }
        defer stmnt.Close() // <<<<< The suspect
        // Insert Account

        http.Redirect(w, r, "/", 303)
    case err != nil:
        common.WriteLog(err.Error(), r)
        http.Error(w, "Failed to insert your account to the database. Try again in a bit.", 500)

    default:
        // Login User

        http.Redirect(w, r, "/", 303)

    }

1 个答案:

答案 0 :(得分:3)

使用db.Exec代替db.Query

  

Exec执行查询而不返回任何行。

VS

  

Query执行返回行的查询

至于为什么,我猜想mysql Rows.Close正在等待数据on the connection

func (rows *mysqlRows) Close() error {
    mc := rows.mc
    if mc == nil {
        return nil
    }
    if mc.netConn == nil {
        return ErrInvalidConn
    }

    // Remove unread packets from stream
    err := mc.readUntilEOF()
    rows.mc = nil
    return err
}

这永远不会发生。

例如,请参阅this