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
  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/ExMan/p/11608559.html
Copyright © 2011-2022 走看看