为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMTTMM 2021-09-13 10:40:13
我正在使用 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第一个是恐慌。当我只打开一次数据库时,怎么会有多个连接,我该如何关闭它们?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

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

所以基本上这里发生的事情是,db.Querydb.QueryRow尝试为自己获取连接,而数据库句柄不会对同时连接的数量施加任何限制,因此当它打开的数量超过 mysql 可以处理的数量时,您的代码会出现恐慌。


查看完整回答
反对 回复 2021-09-13
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

尽量让准备好的发言db.Prepare(query string) (*Stmt, error)和比stmt.Querystmt.Execstmt.Close重用连接。


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 286 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信