在 golang 中使用全局 mongo (mgo) 数据库有什么缺点?
What's the downside of using global mongo (mgo) database in golang?
如果我们使用全局变量来处理数据库操作而不是将其作为参数传递给函数和方法或将其作为字段存储在结构中,是否有任何缺点?
这些缺点是什么(如果有的话)?
假设我们在名为数据库的项目中创建了一个包,在该包中定义了一个名为 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 与我们的数据库进行交互。
请注意,会有很多 goroutines 使用 database.DB(如果它有任何区别的话)
这个问题不是基于意见,请花更多时间阅读和理解
我再重复一遍问题不是基于意见,请花更多时间阅读和理解
使用全局初始化的数据库并传递到需要的地方的过程是公认的和合理的。
然而,只是以
的方式使用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()
对于“并行”请求(有一些关于并行请求的注意事项,为了简洁起见我省略了)。
如果我们使用全局变量来处理数据库操作而不是将其作为参数传递给函数和方法或将其作为字段存储在结构中,是否有任何缺点?
这些缺点是什么(如果有的话)?
假设我们在名为数据库的项目中创建了一个包,在该包中定义了一个名为 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 与我们的数据库进行交互。
请注意,会有很多 goroutines 使用 database.DB(如果它有任何区别的话)
这个问题不是基于意见,请花更多时间阅读和理解
我再重复一遍问题不是基于意见,请花更多时间阅读和理解
使用全局初始化的数据库并传递到需要的地方的过程是公认的和合理的。
然而,只是以
的方式使用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()
对于“并行”请求(有一些关于并行请求的注意事项,为了简洁起见我省略了)。