我正在从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方法上推迟此会话对象?
答案 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的函数并将会话推迟到那里。 通过上述方法,您可以直接访问处理程序内的会话对象。