[Golang软件推荐] Golang通用连接池

文振熙 · · 661 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

附上:

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

1.连接池

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

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

2.go-commons-pool 使用

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

package main

import (
    "github.com/jolestar/go-commons-pool"
    "fmt"
    "time"
)

var pCommonPool *pool.ObjectPool

type PoolTest struct{}

func (this *PoolTest) Test() string {
    return "PoolTest"
}

func init() {
    // 初始化连接池配置项
    PoolConfig := pool.NewDefaultPoolConfig()
    // 连接池最大容量设置
    PoolConfig.MaxTotal = 1000
    WithAbandonedConfig := pool.NewDefaultAbandonedConfig()
    // 注册连接池初始化链接方式
    pCommonPool = pool.NewObjectPoolWithAbandonedConfig(pool.NewPooledObjectFactorySimple(
        func() (interface{}, error) {
            return Link()
        }), PoolConfig, WithAbandonedConfig)
}

// 初始化链接类
func Link() (*PoolTest, error) {
    fmt.Println("初始化PoolTest类!!!")
    return &PoolTest{}, nil
}

func main() {

    //----------------------------------第一次使用将会调用初始化方法---------------------------------
    fmt.Println("第一次使用将会调用初始化方法")
    Test()

    //----------------------------------第二次使用将会复用初始化好的对象---------------------------------
    fmt.Println("第二次使用将会复用初始化好的实例")
    Test()

    //----------------------------------连续多次并发调用当连接池不够用的会扩充连接池---------------------------
    fmt.Println("连续多次并发调用当连接池不够用的会扩充连接池")
    go Test()
    go Test()
    go Test()
    go Test()
    go Test()

    time.Sleep(1 * time.Second)
}

func Test() {
    var client *PoolTest
    // 从连接池中获取一个实例
    obj, _ := pCommonPool.BorrowObject()
    // 转换为对应实体
    if obj != nil {
        client = obj.(*PoolTest)
    }
    // 调用需要的方法
    fmt.Println(client.Test())
    // 交还连接池
    pCommonPool.ReturnObject(client)
}

输出如下:

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

3 总结

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

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:文振熙

查看原文:[Golang软件推荐] Golang通用连接池

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

661 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传