1. 程式人生 > 其它 >Golang語言社群--Golang通用連線池

Golang語言社群--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使用方式如下:

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

在使用過程中要是有任何問題都可以直接在文章下留言,希望這篇文章可以幫助大家解決眼前的問題,多謝大家的支援!

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!