SetMaxOpenConns()没有解决`错误1040:连接太多'

时间:2016-08-30 11:58:21

标签: mysql go

我正在使用Golang和Mysql。我正在使用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))

我在所有id的go例程中查询此函数。

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个并发请求。

2 个答案:

答案 0 :(得分:1)

要更新开放式连接限制并查看该限制,您只需登录mysql并执行以下命令。

mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 90  |
+-----------------+-------+
1 row in set (0.00 sec)

以下命令将打开连接的限制设置为1000,可以根据需要进行更改。

mysql> SET GLOBAL max_connections = 1000;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 90  |
+-----------------+-------+
1 row in set (0.00 sec)

作为参考,您可以从这里mysql link转到mysql官方链接

答案 1 :(得分:0)

首先,您应该检查MySQL服务器允许使用SHOW VARIABLES LIKE 'max_connections'的打开连接数。默认值为151,但如果它小于100,那么您的程序显然会尝试打开太多连接。

但即使它超过100,你仍然可以很容易地得到那个错误。 MySQL的max_connections是一个影响整个服务器的全局变量。如果您的程序在同一台服务器上使用其他数据库,那么它们也会计入您的max_connections限制。或者类似地,如果您有其他程序使用您的数据库服务器,您也可能会用完连接。在这种情况下,您必须为SetMaxOpenConns()使用较小的值或增加max_connections变量。

另请考虑将db.SetMaxIdleConns()设置为低于db.SetMaxOpenConns()的值。否则,您的连接池可能有100(或者您给SetMaxOpenConns的任何值)与数据库服务器的空闲连接。

相关问题