golang mongo推迟会议

时间:2018-01-09 09:24:31

标签: mongodb go mgo

我正在从main方法创建mongodb连接并推迟打开连接。

func main(){
    session := db.CreateConnection(connectionStr)
    defer session.Close()
}

问题是我需要将此sesstion对象传递给用户处理程序struct并从该传递传递给db handler。

type UserController struct {
    DB DBOps
}

type DBOps struct {
    session *mgo.Session
}

问题: 我们如何直接创建会话对象和内部数据库处理程序文件,并在应用程序关闭时推迟?

db.go

type DBOps struct {
    session *mgo.Session
}

func (m *DBOps) Init(connectionstr string) error {
    session, err := mgo.Dial(connectionstr)

    // Check if connection error, is mongo running?
    if err != nil {
        panic(err)
    }
}

在main函数里面我可以调用

func main(){
    db.Init(connectionstr);
}

但如何在main方法上推迟此会话对象?

1 个答案:

答案 0 :(得分:1)

您可以创建全局变量来分配会话对象,从函数返回会话对象。使用会话对象获取数据,然后在从mongo查询后推迟会话。

var (
    mgoSession     *mgo.Session
    databaseName = "myDB"
)

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

func withCollection(collection string, s func(*mgo.Collection) error)   
{    
    session := getSession()
    defer session.Close()
    c := session.DB(databaseName).C(collection)
    return s(c)
}

我已克隆会话对象并将其返回到用于查询mongo的函数并将会话推迟到那里。 通过上述方法,您可以直接访问处理程序内的会话对象。