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. MySQL 5.6, 5.7, 8.0版本的新特性汇总大全

    转载:http://blog.itpub.net/15498/viewspace-2650661/ MySQL 5.6 1).支持GTID复制 2).支持无损复制 3).支持延迟复制 4).支持基于库 ...

  2. Elasticsearch:运用search_after来进行深度分页

    在上一篇文章 "Elasticsearch:运用scroll接口对大量数据实现更好的分页",我们讲述了如何运用scroll接口来对大量数据来进行有效地分页.在那篇文章中,我们讲述了 ...

  3. Navicat Premium 12连接mysql-8.0.15-winx64 出现2059异常

    错误

  4. 记一次 解决 vue 兼容ie11 的问题

    vue2.0 最近项目需要做到兼容ie11,找问题找半天,于是各种百度, 发现引入 babel-polyfill 还是有问题  空白页面 参考它的配置 ( 最后一句代码为引入的资源路径 )  我跟他差 ...

  5. spark_rdd 一波怼完面试官系列

    Resilient Distributed dataset , 弹性分布式数据集. 分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现. RDD是Spark最核心的东西,它表 ...

  6. Java项目出现的问题01----学习

    0 运行环境 MyEcplise2016+Tomcat8.0 1 今天在html的表格提交跳转时发现,想要提交到自己写servlet程序中,却发现总是出错http://localhost:8080/T ...

  7. java读取 xml文件

    java读取xml文件的四种方法  转自https://www.cnblogs.com/lingyao/p/5708929.html Xml代码 1 <?xml version="1. ...

  8. hdu 5572 An Easy Physics Problem 圆+直线

    An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  9. java new一个对象的过程中发生了什么

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...

  10. git避免提交本地配置文件-来自同事的分享

    在项目协作中,对于已经更改的文件,不同的开发者常常需要根据自己的需要对文件进行更改已满足本地开发环境的需求(这种情况很常见,一般是对项目相关的配置项的更改,对业务逻辑代码的更改一般都是正常的协作编码过 ...