一尘不染

Golang,mysql:错误1040:连接过多

go

我正在使用github.com/go-sql-driver/mysql驱动程序。

我打开一个数据库:

db, err := sql.Open("mysql", str)

然后我有两个函数,每个函数用下面的mysql代码调用200次:

rows, err := db.Query("select name from beehives")
if err != nil {
    panic(err)
}       
defer rows.Close()

第二:

    err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre
    switch {
    case err == sql.ErrNoRows:
        err = errors.New("Beehive '"+beehive+"' not found.")
    case err != nil:
        panic("loginBeehive: "+ err.Error())
    default:
        // ... do the work

第一个是恐慌。

当我只打开数据库一次时,如何有多个连接?如何关闭它们?


阅读 170

收藏
2020-07-02

共1个答案

一尘不染

sql.Open并没有真正打开与数据库的连接。

sql.DB维护与数据库的连接池。每次查询数据库时,程序都会尝试从该池获取连接,否则将尝试创建一个新池。一旦关闭这些连接,它们就会放回池中。

这是做什么的rows.Close()。你db.QueryRow("...")做同样的事情在内部,当你打电话Scan(...)

基本问题是您创建的查询过多,每个查询都需要一个连接,但是关闭连接的速度不够快。这样,您的程序必须为每个查询创建一个新的连接。

您可以通过在sql.DB上调用SetMaxOpenConns来限制程序使用的最大连接数。

有关更多信息,请参见http://go-database-sql.org/surprises.html

2020-07-02