[Golang軟件推薦] Golang通用鏈接池

鏈接池在編程中並很多見,連接數據庫,redis等操做都須要鏈接池,不然就會出現併發問題,若是每次操做都創建一條新的連接將會大大消耗資源,筆者也是在使用thrift-Clinet連接Service端使用的時候出現了併發問題,而後找到了一個通用的鏈接池的庫在這裏分享給你們.git

附上:github

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

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 總結

在使用過程當中要是有任何問題均可以直接在文章下留言,但願這篇文章能夠幫助你們解決眼前的問題,多謝你們的支持!this

注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!code

相關文章
相關標籤/搜索