如何用go修复泄漏的mysql连接?

icnyk63a  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(409)

我在本地计算机上有两个mysql数据库(dbconnouter和dbconniner)中的数据,我想将它们处理并整理成第三个数据库(dbconntarget)。
代码运行约17000个周期,然后停止并显示以下错误消息:

[mysql] 2018/08/06 18:20:57 packets.go:72: unexpected EOF
[mysql] 2018/08/06 18:20:57 packets.go:405: busy buffer

据我所知,我正确地关闭了我阅读和使用的连接 Exec 对于写作,我相信它自己处理资源。我也试过准备好的陈述,但没用,结果是一样的。
下面是我的代码的相关部分,它在此之前做过类似的数据库操作,没有任何问题。
由于这是我第一次尝试围棋,我还不知道我可能在哪里浪费我的资源。

import (
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

var dbConnOuter *sql.DB
var dbConnInner *sql.DB
var dbConnTarget *sql.DB

func main() {
    dbConnOuter = connectToDb(dbUserDataOne)
    dbConnInner = connectToDb(dbUserDataTwo)
    dbConnTarget = connectToDb(dbUserDataThree)
    // execute various db processing functions
    doStuff()
}

func connectToDb(dbUser dbUser) *sql.DB {
    dbConn, err := sql.Open("mysql", fmt.Sprintf("%v:%v@tcp(127.0.0.1:3306)/%v", dbUser.username, dbUser.password, dbUser.dbname))
    if err != nil {
        panic(err)
    }
    dbConn.SetMaxOpenConns(500)
    return dbConn
}

// omitted similar db processing functions that work just fine

func doStuff() {
    outerRes, err := dbConnOuter.Query("SELECT some outer data")
    if err != nil {
        panic(err)
    }
    defer outerRes.Close()

    for outerRes.Next() {
        outerRes.Scan(&data1)
        innerRes, err := dbConnInner.Query("SELECT some inner data using", data1)
        if err != nil {
            panic(err)
        }
        innerRes.Scan(&data2, &data3)
        innerRes.Close()

        dbConnTarget.Exec("REPLACE INTO whatever", data1, data2, data3)
    }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题