Go Mysql连接被拒绝,由于连接爆发



Go版本1.18。MySQL服务器是版本8。系统是2018年MacBook Pro i9 6核,32GB RAM。

然而,mysql连接在mysql. queryrow()期间被拒绝。错误信息是:

panic: dial unix /tmp/mysql.sock: connect: connection refused

请注意:我已经找到根本原因(见我的评论在下面的代码),有一个解决方案(使用信号量)。

设置数据库连接时必须使用socket而不是localhost。

根本原因是2000个Go例程试图同时向MySQL发送查询。如何解决这个问题?我的解决方案是使用信号量来限制并发go例程的数量,例如100个。我已经测试过了,信号量解决方案工作得很好。我实际上并不想使用信号量来限制mysql并发查询的数量。

问题:为什么我不能同时发送2000个go-routine查询

import (
"database/sql"
mysqlDriver "github.com/go-sql-driver/mysql"
)
type SomeStruct struct {
a string
b string
}
func main() {
cfg := mysqlDriver.Config{
User:   "DB_USER",
Passwd: "DB_USER",
Net:    "unix",
Addr:   "/tmp/mysql.sock", // MySQL is installed on local
DBName: "databaseName",
}
mysql, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil { 
panic(err) // tested, panic is not caused here.
}
mysql.SetMaxOpenConns(5000)
mysql.SetMaxIdleConns(5000)
if err = mysql.Ping(); err != nil {
panic(err) // tested, panic is not caused here.
}
var wg sync.WaitGroup
for i := 0; i < 2000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
var someStructVar SomeStruct   
err := mysql.QueryRow("select a, b from table where id = ?", i).Scan(&someStructVar.a,  &someStructVar.b) 
if err != nil {
panic(err) // this is where the panic happens. 
}
}
}
wg.Wait()
}

是:my . cnf中所做

[mysqld]
max_connections=5000
connect_timeout=300

如果您的恐慌错误发生在代码之前

mysql.SetMaxOpenConns(5000)

那么错误是当连接到数据库时,尝试更改连接配置到数据库

最新更新