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

Mic*_*ael 18 mysql go

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

我打开一个数据库:

db, err := sql.Open("mysql", str)
Run Code Online (Sandbox Code Playgroud)

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

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

第二:

    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
Run Code Online (Sandbox Code Playgroud)

第一个是慌乱.

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

nus*_*tin 24

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

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

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

基本问题是您创建了太多查询,每个查询都需要连接,但您没有足够快地关闭连接.这样,您的程序必须为每个查询创建一个新连接.

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

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


tmi*_*hel 6

*DB您从中获取的对象sql.Open不对应于单个连接。最好将其视为数据库的句柄:它为您管理连接池。

您可以控制打开的连接与数`(* DB).SetMaxOpenConns其对怠速连接。

因此,基本上发生了这种情况,db.Querydb.QueryRow试图自己获取一个连接,并且数据库句柄对并发连接数没有任何限制,因此,当打开的代码超出了mysql的处理能力时,您的代码会感到恐慌。