Mongodb 什么';在golang使用global mongo(mgo)数据库的缺点是什么?
如果我们使用全局变量来处理数据库操作,而不是将其作为参数传递给函数和方法,或者将其作为字段存储在结构中,是否有任何不利之处 这些缺点是什么(如果有)? 假设我们在一个名为database的项目中创建一个包,在该包中定义一个名为DBMongodb 什么';在golang使用global mongo(mgo)数据库的缺点是什么?,mongodb,go,mgo,Mongodb,Go,Mgo,如果我们使用全局变量来处理数据库操作,而不是将其作为参数传递给函数和方法,或者将其作为字段存储在结构中,是否有任何不利之处 这些缺点是什么(如果有)? 假设我们在一个名为database的项目中创建一个包,在该包中定义一个名为DBvar DB*mgo.database的变量,然后在项目的主函数中填充我们的mongo数据库: func main() { session, err := mgo.Dial("localhost") if err != nil { fmt
var DB*mgo.database
的变量,然后在项目的主函数中填充我们的mongo数据库:
func main() {
session, err := mgo.Dial("localhost")
if err != nil {
fmt.Println(err)
return
}
database.DB = session.DB("mydatabase")
// project code
defer session.Close()
}
之后,我们使用database.DB与数据库交互
请注意,使用database.DB将有很多goroutine(如果有任何区别的话)
问题并非基于意见,请花更多时间阅读和理解
我再次重申,这个问题不是基于意见的,请花更多的时间阅读和理解使用全局初始化数据库将其传递到所需位置的过程是完善和合理的 但是,只需以如下方式使用
database.DB
_ = database.DB.C(foo).Find(q).One(&bar)
到处都有一个明显的缺点:您只使用底层连接池的一个连接,实际上可以确保按顺序处理所有请求
所以你更想做的事情是这样的:
s := database.DB.Session.Copy()
_ = database.DB.C(foo).With(s).Find(q).One(&bar)
defer s.Close()
对于“并行”请求(关于并行请求有一些警告,为了简洁起见,我省略了这些警告).我不同意投票结束,因为这个问题的答案不是基于意见的,而是因为仅仅使用
database.DB
与数据库交互存在经验缺陷,即不使用底层连接池。这显然不是基于意见的,而是关于性能。我真的为stackov感到抱歉erflow社区。谢谢@markuswmahlberg谢谢,就这么简单。