我有一个结构,它为我的系统中的特定对象抽象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
?
答案 0 :(得分:4)
打开与MongoDB或任何其他数据库的连接是一项昂贵的任务,应该执行一次,并尽可能在您的服务中保持运行。
您有三种选择:
这是用于处理DB连接的very informative blog post。 看看这个example,尤其是MongoDB