zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    jQuery和AngularJS的区别小分析
    Angular.element和$document的使用方法分析,代替jquery
    AngularJS中bootstrap启动
    angular 依赖注入原理
    AngularJS介绍
    箭头函数
    Object.create 函数 (JavaScript)
    forEach 方法 (Array) (JavaScript)
    Petapoco 查询 语法
    C# 方法中带默认值的参数
  • 原文地址:https://www.cnblogs.com/ExMan/p/11608559.html
Copyright © 2011-2022 走看看