我在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/

10-09 15:18