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
问题仅出在这个部分,其中两个查询执行Query
和Exec
在一个函数中。
也许Query
和Exec
定义了不同的连接,但我在驱动程序源代码或数据库/ 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中执行