• mgo连接池


    package main
    
    import (
        "log"
        "sync"
        "time"
    
        "gopkg.in/mgo.v2"
    )
    
    var sizeMax = 50
    var size = 0
    var sizeMu = sync.Mutex{}
    var pool = make(chan *mgo.Session, sizeMax)
    
    func getConn() *mgo.Session {
        sizeMu.Lock()
        defer sizeMu.Unlock()
        select {
        case conn := <-pool:
            log.Println("get conn from pool start")
            if conn.Ping() == nil {
                log.Println("get conn from pool success")
                return conn
            } else {
                size--
            }
        default:
        }
        if size >= sizeMax {
            log.Println("继续从连接池获取连接")
            conn := <-pool
            if conn.Ping() == nil {
                return conn
            } else {
                size--
            }
        }
        log.Println("get conn from new")
        session, err := mgo.Dial("localhost")
        if err != nil {
            log.Fatal(err)
        }
        log.Println("get conn from new success")
        size++
        return session
    }
    
    func putConn(conn *mgo.Session) {
        pool <- conn
    }
    
    func main() {
        wg := sync.WaitGroup{}
        for i := 0; i < 100; i++ {
            wg.Add(1)
            if i == 3 {
            }
            go func(n int) {
                log.Println("n:", n, "开始连接")
                conn := getConn()
                time.Sleep(time.Second)
                putConn(conn)
                log.Println("n:", n, "释放连接")
                wg.Done()
            }(i)
        }
        wg.Wait()
        log.Println("连接池数量:", len(pool))
    }
    
    2018/12/07 22:30:48 n: 1 开始连接
    2018/12/07 22:30:48 get conn from new
    2018/12/07 22:30:48 n: 0 开始连接
    2018/12/07 22:30:48 n: 2 开始连接
    2018/12/07 22:30:48 get conn from new success
    2018/12/07 22:30:48 n: 1 释放连接
    2018/12/07 22:30:48 get conn from new
    2018/12/07 22:30:48 get conn from new success
    2018/12/07 22:30:48 n: 0 释放连接
    2018/12/07 22:30:48 继续从连接池获取连接
    2018/12/07 22:30:48 n: 2 释放连接
    2018/12/07 22:30:49 n: 9 开始连接
    2018/12/07 22:30:49 n: 4 开始连接
    2018/12/07 22:30:49 n: 5 开始连接
    2018/12/07 22:30:49 get conn from pool start
    2018/12/07 22:30:49 get conn from pool start
    2018/12/07 22:30:49 n: 6 开始连接
    2018/12/07 22:30:49 n: 7 开始连接
    2018/12/07 22:30:49 n: 8 开始连接
    2018/12/07 22:30:49 n: 3 开始连接
    2018/12/07 22:30:49 继续从连接池获取连接
    2018/12/07 22:30:49 get conn from pool success
    2018/12/07 22:30:49 n: 4 释放连接
    2018/12/07 22:30:49 n: 5 释放连接
    2018/12/07 22:30:49 继续从连接池获取连接
    2018/12/07 22:30:49 n: 6 释放连接
    2018/12/07 22:30:49 get conn from pool success
    2018/12/07 22:30:49 n: 9 释放连接
    2018/12/07 22:30:49 继续从连接池获取连接
    2018/12/07 22:30:49 n: 7 释放连接
    2018/12/07 22:30:49 继续从连接池获取连接
    2018/12/07 22:30:49 n: 8 释放连接
    2018/12/07 22:30:49 继续从连接池获取连接
    2018/12/07 22:30:49 n: 3 释放连接
    2018/12/07 22:30:49 连接池数量: 2
  • 相关阅读:
    64945e3dtw1dii6vfdr19j.jpg(PNG 图像,1497x929 像素)
    软题库
    信管网
    Windows DNA_百度百科
    解释一下关系数据库的第一第二第三范式?
    扩大高校毕业生就业见习补贴范围_网易新闻
    中国计算机技术职业资格网 | 首页
    2016年下半年信息系统项目管理师真题及答案_信息系统项目管理师历年真题及权威答案_信息系统项目管理师试题及模拟题_软考考试题库_希赛网
    杭州市2016-2017年度跨境电商产业紧缺人才需求目录
    计算机技术与软件专业技术资格(水平)考试_百度百科
  • 原文地址:https://www.cnblogs.com/ExMan/p/11608559.html
Copyright © 2020-2023  润新知