在 golang 中使用全局 mongo (mgo) 数据库有什么缺点?

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


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


假设我们在一个名为 Database 的项目中创建一个包,在该包内定义一个名为 DB 的变量var DB *mgo.Database,然后在项目的 main 函数中用我们的 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与我们的数据库进行交互。


请注意,将会有很多 goroutine 使用database.DB(如果有什么区别的话)


该问题不基于意见,请花更多时间阅读和理解


我再次重复这个问题不是基于意见,请花更多时间阅读和理解


慕工程0101907
浏览 84回答 1
1回答

慕后森

使用全局初始化的数据库将其传递到需要的地方的过程是完善且合理的。但是,只需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()对于“并行”请求(有一些关于并行请求的警告,为了简洁起见,我省略了这些警告)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go