golang go-sql-drive mysql连接池的实现
2018-02-22 23:57
344 查看
golang内部自带了连接池功能,刚开始接触golang的时候不了解这个,还自己搞了一个 sql.Open的对象管理池,真的非常囧啊。sql.Open函数实际上是返回一个连接池对象,不是单个连接。在open的时候并没有去连接数据库,只有在执行query、exce方法的时候才会去实际连接数据库。在一个应用中同样的库连接只需要保存一个sql.Open之后的db对象就可以了,不需要多次open。golang中关于mysql的增删改查我在前面的一篇文章中有说明了,不了解的小伙们可以先去了解一下:golang连接mysql操作示例增删改查因为普通程序执行完毕之后资源就会被释放掉,所以这里尝试使用web服务进行演示。
连接池的实现关键在于SetMaxOpenConns和SetMaxIdleConns,其中:SetMaxOpenConns用于设置最大打开的连接数,默认值为0表示不限制。
SetMaxIdleConns用于设置闲置的连接数。设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
pool方法就是从user表中查出一条记录然后存放到map中,最后输出finish。代码到这里就算完了非常简单,下面来测试一下。首先启动http服务,然后使用ab进行并发测试访问:$ ab -c 100 -n 1000 'http://localhost:9090/pool'在数据库中通过show processlist查看连接进程:
golang数据库连接池可以看到有100来个进程。因为避免了重复创建连接,所以使用连接池可以很明显的提高性能。有兴趣的童靴可以去掉连接池代码自己测试一下。完整代码如下:
packets.go:118: write tcp 192.168.3.90:3306: broken pipe上面都是错误都是go-sql-drive本身的输出,有的时候还会出现bad connection的错误。多请求几次后连接池会重新打开新连接这时候就没有问题了。关于这个问题自己有初步的解决方法,但是感觉不太完美,下次再放上来。转载请注明:快乐编程 » golang go-sql-drive mysql连接池的实现来源:http://www.01happy.com/golang-go-sql-drive-mysql-connection-pooling/
开启web服务
首页先启动一个web服务监听9090端口,比较简单不多做说明。db对象初始化
声明一个全局的db对象,并进行初始化。SetMaxIdleConns用于设置闲置的连接数。设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
请求方法
上面开启http请求设置了请求/pool地址的执行方法golang数据库连接池可以看到有100来个进程。因为避免了重复创建连接,所以使用连接池可以很明显的提高性能。有兴趣的童靴可以去掉连接池代码自己测试一下。完整代码如下:
小结
golang这边实现的连接池只提供了SetMaxOpenConns和SetMaxIdleConns方法进行连接池方面的配置。在使用的过程中有一个问题就是数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错。packets.go:32: unexpected EOFpackets.go:118: write tcp 192.168.3.90:3306: broken pipe上面都是错误都是go-sql-drive本身的输出,有的时候还会出现bad connection的错误。多请求几次后连接池会重新打开新连接这时候就没有问题了。关于这个问题自己有初步的解决方法,但是感觉不太完美,下次再放上来。转载请注明:快乐编程 » golang go-sql-drive mysql连接池的实现来源:http://www.01happy.com/golang-go-sql-drive-mysql-connection-pooling/
相关文章推荐
- golang go-sql-drive mysql连接池的实现
- golang使用go-sql-driver实现mysql增删改操作 推荐
- go学习笔记:golang实现的反向代理
- golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法
- golangphp--GO解析PHP源码并实现一个miniPHP服务器
- golang实现sql结果集以json格式输出的方法
- 算法代码实现之选择排序,Golang(Go语言)实现
- Go实战--golang中各种排序算法实现以及生成随机数
- 算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现
- 算法代码实现之插入排序,Golang(Go语言)实现
- 算法代码实现之堆排序,Golang(Go语言)实现
- golang的goroutine是如何实现的?
- Go实战--golang实现MP4视频文件服务器(nareix/joy4)
- 【golang】go-ConcurrentMap实现
- Go sqlx包 + postges pq包实现postgres的批量插入、更新
- Go实战--golang实现静态文件服务器(文件查看,文件上传,文件下载)
- sql server merge 实现 trigger t_merge_gomac_avpickmap
- C#中实现一次执行多条带GO的sql语句实例
- 算法代码实现之Union-Find,Golang(Go语言)实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
- 算法代码实现之希尔排序,Golang(Go语言)实现