在对象的生命周期内保持MongoDB会话开放是明智的吗?

时间:2015-12-03 13:53:44

标签: mongodb go

我有一个结构,它为我的系统中的特定对象抽象MongoDB,并且在它的工厂函数期间,我设置了一些变量,如主机名和其他连接信息。在每个UserService方法*中,它创建一个新会话,完成所需的操作,然后在完成后关闭会话。

系统本身是Web应用程序的后端,因此每个UserService结构的生命周期通常最多只有几秒钟,但可能会为每个请求执行多个操作。所以我想知道是否让session成为结构的成员,在创建UserService时初始化它,然后确保创建它的请求处理函数在完成所有操作后调用close函数它需要。我无法找到任何鼓励或阻止这种行为的东西,所以我不确定我使用的mgo包是否按照这种方式设计。

这是我建议的代码:

type UserService struct {
    callingUserId id.ID //The ID of the user calling this service.
    host string //The host name.
    session mgo.Session //The active session.
}

func NewUserService(userId id.ID) *UserService {
    nus := new(UserService)
    nus.callingUserId = userId
    nus.host = "localhost" //TODO change this to read from file or buffer.
    nus.session, sessionErr = mgo.Dial(nos.host)
    if sessionErr != nil {
        //TODO log error.
    }
    return nus
} 

func (us UserService) GetById(usrId id.ID) *users.User {        
    //TODO get a user from the database with the matching ID using the existing session.        
}

还有一个名为UserService.CloseSession的函数,正如我所提到的,将在创建服务的处理函数完成所有必需的操作后调用。{/ p>

是否有人知道这是一个明智的想法,还是应该在mgo.Dial的每个功能中拨打UserService

1 个答案:

答案 0 :(得分:4)

打开与MongoDB或任何其他数据库的连接是一项昂贵的任务,应该执行一次,并尽可能在您的服务中保持运行。

您有三种选择:

  1. 本地包级别的MongoDB实例。
  2. 使用上下文和编写处理程序。
  3. 保存MongoDB实例的方法接收器。
  4. 这是用于处理DB连接的very informative blog post。 看看这个example,尤其是MongoDB