我正在使用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个并发请求。
答案 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
的任何值)与数据库服务器的空闲连接。