Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 什么';在golang使用global mongo(mgo)数据库的缺点是什么?_Mongodb_Go_Mgo - Fatal编程技术网

Mongodb 什么';在golang使用global mongo(mgo)数据库的缺点是什么?

Mongodb 什么';在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

如果我们使用全局变量来处理数据库操作,而不是将其作为参数传递给函数和方法,或者将其作为字段存储在结构中,是否有任何不利之处

这些缺点是什么(如果有)?

假设我们在一个名为database的项目中创建一个包,在该包中定义一个名为DB
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谢谢,就这么简单。