go创建一个连接池

来源:互联网 发布:机器人离线编程 编辑:程序博客网 时间:2024/06/03 08:01

连接池

1 需要注册连接的方法2 连接必须实现关闭方法3 运行注册pool 4 是否关闭5 写连接池和关闭的时候加锁6 接口的实现是区分*和非*的

具体实现代码

package workpoolimport (    "errors"    "io"    "log"    "sync")//创建连接的接口type createConection interface {    CreateConnect() (io.Closer, error)}//一个pooltype ConectPool struct {    closeChan chan io.Closer    factory   createConection    isClose   bool    mutex     sync.Mutex}//新建一个poolfunc NewConnectPool(poolSize int, factory createConection) (*ConectPool, error) {    if poolSize < 0 {        return nil, errors.New("pool size  < 0")    }    return &ConectPool{        closeChan: make(chan io.Closer, poolSize),        factory:   factory,        isClose:   false,    }, nil}//获取连接func (cp *ConectPool) GetConnect() (io.Closer, error) {    select {    case connect, ok := <-cp.closeChan:        if !ok {            return nil, errors.New("closeChan is closed")        }        log.Println("fetch connect sucessed")        return connect, nil    default:        log.Println("fetch connect faild,create a new one")        return cp.factory.CreateConnect()    }}//把一个连接放入池子func (cp *ConectPool) PutConnect(aConnection io.Closer) {    cp.mutex.Lock()    defer cp.mutex.Unlock()    if cp.isClose == true {        return    }    select {    case cp.closeChan <- aConnection:        log.Println("put connection into the closer!")    default:        log.Println("put faild.close connection!")        aConnection.Close()    }}//关闭连接func (cp *ConectPool) Close() {    cp.mutex.Lock()    defer cp.mutex.Unlock()    if cp.isClose != true {        cp.isClose = true    }    close(cp.closeChan)    for aConnect := range cp.closeChan {        aConnect.Close()    }}

测试例子

//创建一个connectvar connectId int32 = 0type DbConnect struct {    cid int32}func (db *DbConnect) getConnectId() int32 {    return db.cid}func (db *DbConnect) Close() error {    return nil}//创建连接type DbConnectCreater struct{}func (dbc *DbConnectCreater) CreateConnect() (io.Closer, error) {    id := atomic.AddInt32(&connectId, 1)    return &DbConnect{cid: id}, nil}func tpool3() {    fmt.Println("test connect pool3")    creater := &DbConnectCreater{}    pool3, err := workpool.NewConnectPool(10, creater)    if err != nil {        log.Println("create faild")    }    defer pool3.Close()    //放入10个连接    for i := 0; i < 10; i++ {        conect, err := creater.CreateConnect()        if err == nil {            pool3.PutConnect(conect)        }    }    for i := 0; i < 12; i++ {        connect, err := pool3.GetConnect()        if err == nil {            log.Println("connect_id=", connect.(*DbConnect).getConnectId())        }    }}

具体可以看这个 https://github.com/beckbikang/go_pool

原创粉丝点击