链接池在编程中并很多见,连接数据库,redis等操做都须要链接池,不然就会出现并发问题,若是每次操做都创建一条新的连接将会大大消耗资源,笔者也是在使用thrift-Clinet连接Service端使用的时候出现了并发问题,而后找到了一个通用的链接池的库在这里分享给你们.git
附上:github
喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-poolredis
在使用以前咱们须要先了解清楚链接池的概念,总结下来链接池主要解决如下几类问题:数据库
喵咪写了一个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
在使用过程当中要是有任何问题均可以直接在文章下留言,但愿这篇文章能够帮助你们解决眼前的问题,多谢你们的支持!this
注:笔者能力有限有说的不对的地方但愿你们可以指出,也但愿多多交流!code