【问题标题】:golang mongo defer sessionsgolang mongo 推迟会话
【发布时间】:2018-07-12 22:02:48
【问题描述】:

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

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

问题是我需要将此会话对象传递给用户处理程序结构并从该传递到数据库处理程序。

type UserController struct {
    DB DBOps
}

type DBOps struct {
    session *mgo.Session
}

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

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)
    }
}

在主函数里面我可以直接调用

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

但是如何在主方法上延迟这个会话对象?

【问题讨论】:

标签: mongodb go mgo


【解决方案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 并在那里推迟会话的函数。 通过上述方法,您可以直接访问处理程序内的会话对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多