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 建立乙個資料庫連線池,連線池...