如何使用Go修复泄漏的MySQL conns?

时间:2018-08-06 17:07:25

标签: mysql go

我的本​​地计算机上有2个MySQL数据库(dbConnOuter和dbConnInner)中的数据,我想对其进行处理并整理到第3个数据库(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进行书写,我相信它可以处理自己的资源。我也尝试了准备好的语句,但没有帮助,结果是一样的。

下面是我代码的相关部分,在此之前,它执行了类似的数据库操作,没有任何问题。

由于这是我第一次使用Go进行的实验,所以我还看不到我可能在浪费我的资源。

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)
    }
}

0 个答案:

没有答案