我在Mysql中使用golang。我正在使用apache benchmark tool
测试服务器上的负载。我收到太多连接错误。我读了this post 。因此,我在代码中添加了SetMaxOpenConns(100)
。仍然我收到了太多的连接错误。
我正在执行以下查询ab -n 1000 -k -c 20 -p post.txt -T application/x-www-form-urlencoded http://localhost:8084/abcd
注意: post.txt文件包含35个ID(整数类型)的数组。这是我的主要功能:
db, err := models.NewDB("root:@/rules")
if err != nil {
panic(err)
}
db.SetMaxOpenConns(100)
http.Handle("/abcd", getReq(db))
log.Fatal(http.ListenAndServe(":8084", nil))
我在go例程中查询此函数的所有ID。
func getRuleforProduct(db *sql.DB, id int) map[int]string {
m := make(map[int]string)
var res string
err := db.QueryRow("select rules from table where product_id = ?", id).Scan(&res)
checkError(err)
m[id] = res
return m
}
即使每秒请求更少,如何解决此问题。我希望代码能够至少处理20个并发请求。
最佳答案
首先,您应该使用SHOW VARIABLES LIKE 'max_connections'
检查MySQL服务器允许多少个打开的连接。默认值为151,但如果小于100,则您的程序显然会尝试打开太多连接。
但是,即使它超过100,您仍然可以轻松地得到该错误。 MySQL的max_connections
是影响整个服务器的全局变量。如果您的程序在同一服务器上使用其他数据库,它们也将计入max_connections
限制。或者类似地,如果您使用数据库服务器使用其他程序,则连接也可能用完。在这种情况下,您必须为SetMaxOpenConns()
使用较小的值,或者增加max_connections
变量。
还可以考虑将db.SetMaxIdleConns()
设置为小于db.SetMaxOpenConns()
的值。否则,您可能有100个连接数据库服务器的空闲连接(或您给SetMaxOpenConns
赋予的任何值)用尽了连接池。
关于mysql - SetMaxOpenConns()不解决 `Error 1040: Too many connections`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39226889/