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

mgo连接池的更多相关文章

  1. golang mgo的mongo连接池设置:必须手动加上maxPoolSize

    本司礼物系统使用了golang的 mongo库 mgo,中间踩了一些坑,总结下避免大家再踩坑 golang的mgo库说明里是说明了开启连接复用的,但观察实验发现,这并没有根本实现连接的控制,连接复用仅 ...

  2. mgo 的 session 与连接池

    简介 mgo是由Golang编写的开源mongodb驱动.由于mongodb官方并没有开发Golang驱动,因此这款驱动被广泛使用.mongodb官网也推荐了这款开源驱动,并且作者在github也表示 ...

  3. Golang 连接 MongoDB使用连接池

    可以免费试用 MongoDB ,500MB 平时做测试没有问题啦,连接数据库可能因为网络有点慢,但是我们是测试啊,不在乎这点吧~ 这是怎么申请试用版的博客,感谢这位大佬.注册好用起来很方便~ 传送门 ...

  4. 连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持 ...

  5. C3p0连接池配置

    在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection co ...

  6. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...

  7. common-pool2 学习:thrift连接池的另一种实现

    对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...

  8. druid连接池获取不到连接的一种情况

    数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...

  9. C3P0连接池配置和实现详解

    一.配置 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> ...

随机推荐

  1. 02—mybatis的基本用法01

    深入mybatis的配置文件(mybatis-config.xml)   MyBatis的配置文档结构 顶层configuration 配置 properties 属性 settings 设置 typ ...

  2. P5657 格雷码

    思路 考场上的递归思路 每次向下递归的时候判断是左半边还是右半边即可 注意向右半边递归之后下一层序列要反转过来即可 代码 #include <cstdio> #include <al ...

  3. [NOI2016]循环之美——结论+莫比乌斯反演

    原题链接 好妙的一道神仙题 题目大意 让你求在\(k\)进制下,\(\frac{x}{y}\)(\(x\in [1,n],y\in [1,m]\))中有多少个最简分数是纯循环小数 SOLUTION 首 ...

  4. Linux学习日志(一)

    1 .Ubuntu 自带python 2 和 python 3的版本,切换方法如下: shell里执行: sudo update-alternatives --install /usr/bin/pyt ...

  5. Modbus​协议​深入​讲解_NI

    from:https://www.ni.com/zh-cn/innovations/white-papers/14/the-modbus-protocol-in-depth.html 已​更新 Mar ...

  6. “景驰科技杯”2018年华南理工大学程序设计竞赛 B. 一级棒!(并查集)

    题目链接:https://www.nowcoder.com/acm/contest/94/B 题意:在一棵有 n 个节点的树上,有两种操作,一个是把 u 到 v 的路径走一遍,另一个是查询 u 到 f ...

  7. BZOJ 4802: 欧拉函数 (Pollard-Rho)

    开始一直T,原来是没有srand- CODE #include<bits/stdc++.h> using namespace std; typedef long long LL; vect ...

  8. Codeforces Round #346 (Div. 2) C题

    C. Tanya and Toys In Berland recently a new collection of toys went on sale. This collection consist ...

  9. 实体类 @TableName&@TableField&@Version

    //指向表table_biao @TableName("table_biao)public class UserThirdLogin extends Model<UserThirdLo ...

  10. 在浏览器上打开、预览Excel xlsx表格文件

    现在的HTML5,有了FileReader文件读写API, 真是让javascript的能力大幅提升. 解析zip压缩文件.解析Excel xlsx 表格文档各种文件预览,实现起来也有了可能性,以前的 ...