mongo驱动 mgo 连接池问题

我想知道mongo 和驱动 mgo是怎么处理连接池的问题,我用Dial打开很多连接,mongo控制台就显示打开了多少连接,这是没用到连接池?

共 3 个回复


jindaodama

mgo自带连接池的,默认3个idle,封装一下,如下:

package db

import (
    "labix.org/v2/mgo"
    //  "labix.org/v2/mgo/bson"
)

const (
    USER string = "user"
    MSG  string = "msg"
)

var (
    session      *mgo.Session
    databaseName = "test"
)

func Session() *mgo.Session {
    if session == nil {
        var err error
        session, err = mgo.Dial("localhost")
        if err != nil {
            panic(err) // no, not really
        }
    }
    return session.Clone()
}

func M(collection string, f func(*mgo.Collection)) {
    session := Session()
    defer func() {
        session.Close()
        if err := recover(); err != nil {
            Log("M", err)
        }
    }()
    c := session.DB(databaseName).C(collection)
    f(c)
}

使用示例:

var m = M{}
db.M(db.USER, func(c *mgo.Collection) {
        c.Find(M{"_id": id}).One(m)
        Log("find one m", m, m["name"], m["img"])
    })
# 0

ccav

先dial一个session出来 然后使用 .clone来分配 session

# 1