Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MSSQL泄漏连接_Sql Server_Go - Fatal编程技术网

Sql server MSSQL泄漏连接

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

我对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, 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()
...