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. java递归方法查找某目录下包含有某字符串的文件

    最近在安装mysql5.6的时候,因为是免安装版的所以有些配置项需要手动配置.但是配置某一项的时候(例如:max_allowed_packet=xxxxx),不知道max_allowed_packet ...

  2. CentOS 6 自定义单实例 二进制方式 安装mariadb-5.5.59

    系统平台: CentOS release 6.9 (Final) 内核 2.6.32-696.el6.x86_64 1.去官网下载适合的二进制包 http://mariadb.org/ mariadb ...

  3. 02—EF初次体验

    新建个表,我用的是sql server2014,我会把文件发上来,如果是低版本的,可以执行语句,数据库就自己创建吧. USE [testdb] GO CREATE TABLE [dbo].[Produ ...

  4. [NOI2008]假面舞会——数论+dfs找环

    原题戳这里 思路 分三种情况讨论: 1.有环 那显然是对于环长取个\(gcd\) 2.有类环 也就是这种情况 1→2→3→4→5→6→7,1→8→9→7 假设第一条链的长度为\(l_1\),第二条为\ ...

  5. Unity 截图选择框,中间全透明,边缘半透明

    效果:点击白色框可拖拽选择区域 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; u ...

  6. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  7. CSS网站收藏

    css3动画:http://isux.tencent.com/css3/tools.html

  8. 关于单片机特殊功能寄存器(SFR)和内存(RAM)公用地址:80-FF 如何区分

    RAM 的 80-FF 需要间接寻址进行访问 如:  MOV R0,#80H;    MOV A,@R0 ;  (内存 80H地址内的数据放到A中) SFR的80-FF需要直接寻址进行访问如: MOV ...

  9. CentOS上部署Kubernetes集群

    1.开始前系统环境准备 # 1.设置基本环境 yum install -y net-tools conntrack-tools wget vim ntpdate libseccomp libtool- ...

  10. T2695 桶哥的问题——吃桶 题解

    校内测试 ------T3 对于这个题,首先想到的应该就是暴力枚举了吧,看看数据范围,60就是白送的啦!(但是我也不知道怎么才20分qwq) 思路分析: 这个题要你求所有套餐的总价值,先看一眼产生套餐 ...