在golang中使用全局mongo(mgo)数据库有何弊端?

时间:2019-07-10 22:00:21

标签: mongodb go mgo

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

还有的缺点吗?

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

比方说,我们在名为数据库的项目内创建一个包,在该包内定义一个名为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(如果有所不同)

该问题不是基于观点的,请花更多时间阅读和理解

1 个答案:

答案 0 :(得分:1)

使用全局初始化的数据库传递到需要的地方的过程已经建立并且合理。

但是,只是使用database.DB的方式类似

_ = database.DB.C(foo).Find(q).One(&bar)
整个地方的

都有一个明显的缺点:您只使用基础连接池中的一个连接,实际上确保了 all 请求被顺序处理。

因此,您宁愿执行以下操作:

s := database.DB.Session.Copy()
_ = database.DB.C(foo).With(s).Find(q).One(&bar)
defer s.Close()

对于“并行”请求(关于并行请求有一些警告,为简洁起见,我省略了它们。)