GoLang MSSQL泄漏连接

时间:2017-03-23 22:30:20

标签: sql-server go

golang sql和denisenkom / go-mssqldb都有奇怪的问题。

我的代码部分:

func Auth(username string, password string, remote_ip string, user_agent string) (string, User, error) {
var token string
var user = User{}

query := `exec dbo.sp_get_user ?,?`

rows, err := DB.Query(query, username, password)
if err != nil {
    return token, user, err
}
defer rows.Close()

rows.Next()
if err = rows.Scan(&user.Id, &user.Username, &user.Description); err != nil {
    log.Printf("SQL SCAN: Failed scan User in Auth. %v \n", err)
    return token, user, err
}

hashFunc := md5.New()
hashFunc.Write([]byte(username + time.Now().String()))

token = hex.EncodeToString(hashFunc.Sum(nil))

query = `exec dbo.sp_set_session ?,?,?,?`

_, err = DB.Exec(query, user.Id, token, remote_ip, user_agent)
if err != nil {
    return token, user, err
}

return token, user, nil
}

问题:defer rows.Close() - 无法正常工作

此后使用DB.Connection.Stats().OpenConnections我总是打开2个连接(重复用户登录后仍然是整个应用程序生命周期的2个连接)

但如果我将func重写为:

...
    query := `exec dbo.sp_get_user ?,?`

    rows, err := DB.Query(query, username, password)
    if err != nil {
        return token, user, err
    }
    defer rows.Close()

    rows.Next()
    if err = rows.Scan(&user.Id, &user.Username, &user.Description); err != nil {
        log.Printf("SQL SCAN: Failed scan User in Auth. %v \n", err)
        return token, user, err
    }

    rows.Close()
...

然后关闭行下划线stmt,下一个DB.Connection.Stats().OpenConnections将始终打开1个连接。

我的应用中的

DB只是从sql.Open

返回基础连接

问题仅出在这个部分,其中两个查询执行QueryExec在一个函数中。

也许QueryExec定义了不同的连接,但我在驱动程序源代码或数据库/ sql源代码中找不到它。

谢谢! (对不起英语,如果它太糟糕了)

PS:

exec dbo.sp_get_user ?,? - 从用户表中选择,而不是更多。

exec dbo.sp_set_session ?,?,?,? - 简单地插入用户表,而不是更多

在MSSQL中 - DBCC INPUTBUFFER向我展示了query = 'cast(@@identity as bigint)',它在第593行的denisenkom / go-mssqldb mssql.go中执行

0 个答案:

没有答案
相关问题