鏈接池在編程中並很多見,連接數據庫,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