【问题标题】:SetMaxOpenConns() not solving `Error 1040: Too many connections`SetMaxOpenConns() 无法解决“错误 1040:连接过多”
【发布时间】:2020-04-03 03:34:04
【问题描述】:

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

我在 goroutine 中查询这个函数的所有 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 个并发请求。

【问题讨论】:

  • netstat -antp 长什么样子?

标签: mysql go


【解决方案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官方链接mysql link

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 1970-01-01
      • 2015-03-24
      • 2017-10-30
      • 2015-08-06
      • 2022-01-02
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多