golang通用連線池的實現

2021-08-17 19:10:54 字數 2054 閱讀 4280

golang的channel除了goroutine通訊之外還有很多其他的功能,本文將實現一種基於channel的通用連線池。

連線池的實現不依賴具體的例項,而依賴某個介面,本文的連線池選用的是io.closer介面,只要是實現了該介面的物件都可以被池管理。

當然,你可以實現基於inte***ce{}的連線池,這樣任何物件都可以被管理。

將連線控制代碼存入channel中,由於快取channel的特性,獲取連線時如果池中有連線,將直接返回,如果池中沒有連線,將阻塞或者新建連線(沒超過最大限制的情況下)。

由於面向介面程式設計,所有建立連線的邏輯是不清楚的,這裡需要傳入乙個函式,該函式返回乙個io.closer物件。

由於併發問題,在需要操作池中互斥資料的時候需要加鎖。

package pool

import (

"errors"

"io"

"sync"

"time"

)var (

errinvalidconfig = errors.new("invalid pool config")

errpoolclosed = errors.new("pool closed")

)type factory func

()(io.closer, error)

typepoolinte***ce

type genericpool struct

func

newgenericpool

(minopen, maxopenint, maxlifetime time.duration, factory factory)

(*genericpool, error)

p := &genericpool

for i := 0; i < minopen; i++

p.numopen++

p.pool <- closer

} return p, nil

}func

(p *genericpool)

acquire

()(io.closer, error)

for

// todo maxlifttime處理

return closer, nil }}

func

(p *genericpool)

getorcreate

()(io.closer, error)

p.lock()

if p.numopen >= p.maxopen

// 新建連線

closer, err := p.factory()

if err != nil

p.numopen++

p.unlock()

return closer, nil

}// 釋放單個資源到連線池

func

(p *genericpool)

release

(closer io.closer)

error

p.lock()

p.pool <- closer

p.unlock()

return

nil}

// 關閉單個資源

func

(p *genericpool)

close

(closer io.closer)

error

// 關閉連線池,釋放所有資源

func

(p *genericpool)

shutdown

()error

p.lock()

close(p.pool)

for closer := range p.pool

p.closed = true

p.unlock()

return

nil}

基於該連線池,可以管理所有io.closer物件。比如memcached,redis等等,非常方便!

連線池的實現

工程架構中有很多訪問下游的需求,下游包括但不限於服務 資料庫 快取,其通訊步驟為 1 與下游建立乙個連線 2 通過這個連線,收發請求 3 互動結束,關閉連線,釋放資源 當併發量很低的時候,建立連線和關閉連線的過程是沒問題的,但當服務單機qps達到幾百 幾千的時候,建立連線和銷毀連線就會成為瓶頸,此時...

JDBC連線池實現

jdbc connection pool 的注意事項有 1.有乙個簡單的函式從連線池中得到乙個 connection。2.close 函式必須將 connection 放回 資料庫連線池。3.當資料庫連線池中沒有空閒的 connection,資料庫連線池必須能夠自動增加 connection 個數。...

Java實現連線池

連線池原理,非常透徹 public class connectionpool catch exception e try catch exception e static catch filenotfoundexception e catch ioexception e 建立乙個資料庫連線池,連線池...