Golang通用连接池

、大家好,我是社区主编彬哥,本篇文章是给大家转载一篇关于连接池的文章。

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家.

附上:

喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-pool

1.连接池

在使用之前我们需要先了解清楚连接池的概念,总结下来连接池主要解决以下几类问题:

  • 减少连接创建时间 与数据库还是Thrift等程序建立连接都是有开销的。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。
  • 简化的编程模式 当使用连接池时,具体的操作都是统一的不用关心初始化等各项关心点
  • 受控的资源使用 如果用户不使用连接池,而是每当需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生。

2.go-commons-pool 使用

喵咪写了一个demo使用方式如下:

  1. package main
  2. import (
  3. "github.com/jolestar/go-commons-pool"
  4. "fmt"
  5. "time"
  6. )
  7. var pCommonPool *pool.ObjectPool
  8. type PoolTest struct{}
  9. func (this *PoolTest) Test() string {
  10. return "PoolTest"
  11. }
  12. func init() {
  13. // 初始化连接池配置项
  14. PoolConfig := pool.NewDefaultPoolConfig()
  15. // 连接池最大容量设置
  16. PoolConfig.MaxTotal = 1000
  17. WithAbandonedConfig := pool.NewDefaultAbandonedConfig()
  18. // 注册连接池初始化链接方式
  19. pCommonPool = pool.NewObjectPoolWithAbandonedConfig(pool.NewPooledObjectFactorySimple(
  20. func() (interface{}, error) {
  21. return Link()
  22. }), PoolConfig, WithAbandonedConfig)
  23. }
  24. // 初始化链接类
  25. func Link() (*PoolTest, error) {
  26. fmt.Println("初始化PoolTest类!!!")
  27. return &PoolTest{}, nil
  28. }
  29. func main() {
  30. //----------------------------------第一次使用将会调用初始化方法---------------------------------
  31. fmt.Println("第一次使用将会调用初始化方法")
  32. Test()
  33. //----------------------------------第二次使用将会复用初始化好的对象---------------------------------
  34. fmt.Println("第二次使用将会复用初始化好的实例")
  35. Test()
  36. //----------------------------------连续多次并发调用当连接池不够用的会扩充连接池---------------------------
  37. fmt.Println("连续多次并发调用当连接池不够用的会扩充连接池")
  38. go Test()
  39. go Test()
  40. go Test()
  41. go Test()
  42. go Test()
  43. time.Sleep(1 * time.Second)
  44. }
  45. func Test() {
  46. var client *PoolTest
  47. // 从连接池中获取一个实例
  48. obj, _ := pCommonPool.BorrowObject()
  49. // 转换为对应实体
  50. if obj != nil {
  51. client = obj.(*PoolTest)
  52. }
  53. // 调用需要的方法
  54. fmt.Println(client.Test())
  55. // 交还连接池
  56. pCommonPool.ReturnObject(client)
  57. }

输出如下:

第一次使用将会调用初始化方法
初始化PoolTest类!!!PoolTest
第二次使用将会复用初始化好的实例
PoolTest
连续多次并发调用当连接池不够用的会扩充连接池
PoolTest
初始化PoolTest类!!!PoolTest
PoolTest
初始化PoolTest类!!!PoolTest
PoolTest

3 总结

在使用过程中要是有任何问题都可以直接在文章下留言,希望这篇文章可以帮助大家解决眼前的问题,多谢大家的支持!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

出现System.web.mvc冲突的原因及解决方法CS0433

CS0433:类型“System.Web.Mvc.WebViewPage<TModel>”同时存在于URL1和URL2中

3021
来自专栏LanceToBigData

linux(五)之vi编译器

前面介绍了linux的常用命令和对文本的操作,接下来我将对大家领略一下vi编译器的强大功能。 希望大家觉得写的还不错的话可以点个“推荐”哦! 一、vim/vi编...

2238
来自专栏代码GG之家

Scoops android app多主题架构(五)

原理分析 核心代码位置 https://github.com/52inc/Scoops/tree/master/scoops/src/main/java/com...

2039
来自专栏happyJared

Linux私房菜:文件目录管理及常见命令

921
来自专栏吴伟祥

关于在linux下清屏的几种技巧 转

在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法。

1292
来自专栏Petrichor的专栏

Ubuntu输入密码后重返登录界面

进入了登录界面后,不用输入密码,按住 Ctrl+Alt+F1(F1~F6都行) 打开profile文件

1612
来自专栏python3

python标准库--logging模块

它们的值为0-50(也可以自定义级别),这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来...

931
来自专栏网络

Nginx 教程(1):基本概念

英文:netguru,翻译:开源中国 www.oschina.net/translate/nginx-tutorial-basics-concepts 简介 嗨...

19510
来自专栏Golang语言社区

Golang语言社区--Golang通用连接池

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrif...

56510
来自专栏WeaponZhi

Python爬虫入门(二)

上一篇文章大概的讲解了 Python 爬虫的基础架构,我们对 Python 爬虫内部运行流程有了一定的理解了,我们这节将用一些简单的 Python 代码实现Py...

3996

扫码关注云+社区

领取腾讯云代金券