Sql server MSSQL泄漏连接
我对golang sql和denisenkom/go MSSQLSDB有奇怪的问题 我的代码部分: 问题:Sql server MSSQL泄漏连接,sql-server,go,Sql Server,Go,我对golang sql和denisenkom/go MSSQLSDB有奇怪的问题 我的代码部分: 问题:延迟行。关闭()-工作不正常 在此之后,使用DB.Connection.Stats() 但如果我将func重写为: ... query := `exec dbo.sp_get_user ?,?` rows, err := DB.Query(query, username, password) if err != nil { return token
延迟行。关闭()
-工作不正常
在此之后,使用DB.Connection.Stats()
但如果我将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
将始终打开一个连接
我的应用程序中的DB
只是从sql返回底层连接。打开
问题仅存在于这一部分,其中在一个函数中执行了两次带有query
和Exec
的查询
也许Query
和Exec
定义了不同的连接,但我在驱动程序源代码或数据库/sql源代码中找不到
谢谢大家!!(如果英语这么差,那就抱歉了)
附言:
exec dbo.sp\u get\u user?,?
是从用户表中简单地选择,而不是更多
exec dbo.sp\u set\u session?、?、?、?
-是简单的用户表插入,而不是更多
在MSSQL中-DBCC INPUTBUFFER
显示查询='cast(@@identity as bigint)
,该查询在denisenkom/go MSSQLSDB MSSQL.go第593行执行如果您知道何时可以调用行.Close()
,请自己执行。您可以调用Close
任意次数,因此延迟
表示“以防万一”。@RayfenWindspear,谢谢,但我想知道为什么会出现这种情况。因为defer
语句将执行放在调用函数的后面,因此在第二个变量中,执行必须与close相同。我唯一能想到的是defer
s不会在panic
事件中运行。呃,等等,是的,正如您所说,Query
和Exec
这里将使用两种不同的连接。在调用Close
之前,Query
中的一个不会释放到池中,因此Exec
会分配另一个。这可以追溯到我最初的评论。如果您知道您已经完成了,请尽快关闭它。同时检查行。错误,请参阅。如果您知道何时可以调用rows.Close()
,请自己完成。您可以调用Close
任意次数,因此延迟
表示“以防万一”。@RayfenWindspear,谢谢,但我想知道为什么会出现这种情况。因为defer
语句将执行放在调用函数的后面,因此在第二个变量中,执行必须与close相同。我唯一能想到的是defer
s不会在panic
事件中运行。呃,等等,是的,正如您所说,Query
和Exec
这里将使用两种不同的连接。在调用Close
之前,Query
中的一个不会释放到池中,因此Exec
会分配另一个。这可以追溯到我最初的评论。如果您知道已经完成了,请尽快关闭它。同时检查行。错误,请参阅。
...
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()
...