mysql – Golang RESTful API负载测试导致过多的数据库连接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – Golang RESTful API负载测试导致过多的数据库连接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3124字,纯文字阅读大概需要5分钟。
内容图文
![mysql – Golang RESTful API负载测试导致过多的数据库连接](/upload/InfoBanner/zyjiaocheng/900/271a9ad2ae794dc68ff70e145ea9e922.jpg)
我认为我在Golang中管理数据库连接池存在严重问题.我使用Gorilla Web工具包构建了一个RESTful API,当只有少量请求被发送到服务器时,它工作得很好.但是现在我开始使用loader.io站点进行负载测试.我为这篇长篇文章道歉,但我想给你全面的了解.
在进一步讨论之前,这里有一些关于运行API和MySQL的服务器的信息:
专用主机Linux
8GB RAM
转到1.1.1版
使用go-sql-driver进行数据库连接
MySQL 5.1
使用loader.io我可以发送1000 GET请求/ 15秒没有问题.但是当我发送1000个POST请求/ 15秒时,我会收到很多错误,所有错误都是ERROR 1040太多的数据库连接.许多人在网上报道了类似的问题.请注意,我现在只测试一个特定的POST请求.对于这篇帖子请求,我确保了以下内容(许多其他人也在线提出)
>我确保我不使用Open和Close * sql.DB来实现短期功能.所以我在连接池中只创建了全局变量,如下面的代码所示,尽管我在这里建议是因为我不喜欢使用全局变量.
>我确保尽可能使用db.Exec,并且只在预期结果时使用db.Query和db.QueryRow.
由于上面没有解决我的问题,我尝试设置db.SetMaxIdleConns(1000),解决了1000个POST请求/ 15秒的问题.意思是不再有1040个错误.然后我将负载增加到2000 POST请求/ 15秒,然后我又开始获得ERROR 1040.我试图增加db.SetMaxIdleConns()中的值,但这没有什么区别.
通过运行SHOW STATUS WHERE variable_name =’Threads_connected’,我从MySQL数据库获得了一些关于连接数的连接统计信息;
对于1000个POST请求/ 15秒:观察到#threads_connected~ = 100
对于2000个POST请求/ 15秒:观察到#threads_connected~ = 600
我还增加了my.cnf中MySQL的最大连接数,但这并没有什么区别.你有什么建议?代码看起来不错吗?如果是,那么可能连接只是有限的.
您将在下面找到该代码的简化版本.
var db *sql.DB
func main() {
db = DbConnect()
db.SetMaxIdleConns(1000)
http.Handle("/", r)
err := http.ListenAndServe(fmt.Sprintf("%s:%s", API_HOST, API_PORT), nil)
if err != nil {
fmt.Println(err)
}
}
func DbConnect() *sql.DB {
db, err := sql.Open("mysql", connectionString)
if err != nil {
fmt.Printf("Connection error: %s\n", err.Error())
return nil
}
return db
}
func PostBounce(w http.ResponseWriter, r *http.Request) {
userId, err := AuthRequest(r)
//error checking
//ready requesy body and use json.Unmarshal
bounceId, err := CreateBounce(userId, b)
//return HTTP status code here
}
func AuthRequest(r *http.Request) (id int, err error) {
//parse header and get username and password
query := "SELECT Id FROM Users WHERE Username=? AND Password=PASSWORD(?)"
err = db.QueryRow(query, username, password).Scan(&id)
//error checking and return
}
func CreateBounce(userId int, bounce NewBounce) (bounceId int64, err error) {
//initialize some variables
query := "INSERT INTO Bounces (.....) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
result, err := db.Exec(query, ......)
//error checking
bounceId,_ = result.LastInsertId()
//return
}
解决方法:
Go database / sql不会阻止您创建与数据库无限数量的连接.如果池中存在空闲连接,则将使用它,否则将创建新连接.
因此,在加载时,您的请求处理程序sql.DB可能找不到空闲连接,因此在需要时会创建新连接.这样可以在可能的情况下为一些有用的空闲连接进行搅拌,并在需要时创建新的连接,最终达到Db的最大连接数.并且,遗憾的是,在Go 1.1中,没有一种方便的方法(例如SetMaxOpenConns)来限制开放连接.
升级到较新版本的Golang.在Go 1.2+你获得SetMaxOpenConns.和check out the MySql docs for starting setting然后调整.
db.SetMaxOpenConns(100) //tune this
如果必须使用Go 1.1,则需要在代码中确保* sql.DB一次仅被N个客户端使用.
内容总结
以上是互联网集市为您收集整理的mysql – Golang RESTful API负载测试导致过多的数据库连接全部内容,希望文章能够帮你解决mysql – Golang RESTful API负载测试导致过多的数据库连接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。