2017-11-11 163 views
-1

这里是我的DAO实现的一个片段:MongoDB:我应该一直保持全局会话吗?

type (
    User struct { 
     Name string `json:"name" bson:"name"` 
     ... 
    } 

    UserDAO struct { 
     *mgo.Database 
    } 
) 

func NewUserDAO() (*UserDAO, error) { 
    session, err := mgo.Dial("mongodb://127.0.0.1:27017/test") 
    if err != nil { 
     return nil, err 
    } 

    return &UserDAO{session.DB("")}, nil 
} 

func (d *UserDAO) Insert(user User) error { 
    return d.C("users").Insert(user) 
} 

func (d *CandleDAO) Find(name string) ([]User, error) { 
    var result []User 
    if err := d.C("users").Find(bson.M{"name": name)}).Sort("time").All(&result); err != nil { 
     return nil, err 
    } 
    return result, nil 
} 

... 

func (d *CandleDAO) Close() { 
    d.Session.Close() 
} 

这里是我如何调用它:

dao, err := dao.NewUserDAO() 
if err != nil { 
    Log.Error(err.Error()) 
    return 
} 

// close session... is this OK? 
defer dao.Close() 

users, err := dao.Find(&broker.Symbol{"BTC", "USD"}); if err != nil { 
    Log.Error(err.Error()) 
    return 
} 

for i, user := range users { 
    fmt.Printf("%d ==> %v\n", i, user) 
} 

上面的代码工作... ...和我的问题很简单:我会保持全球mgo.Database实例,或者当我完成时始终关闭会话并在需要时创建新会话是否正确?

+0

相关/可能重复[太多打开文件在mgo去服务器](https://stackoverflow.com/questions/47179890/too-many-open-files-in-mgo-go-server/47180097#47180097 );和[gopkg.in/mgo.v2(Mongo,Go)中的并发]](https://stackoverflow.com/questions/42492020/concurrency-in-gopkg-in-mgo-v2-mongo-go/42495522#42495522) ;和[mgo - 查询性能似乎一贯很慢(500-650毫秒)](https://stackoverflow.com/questions/40999637/mgo-query-performance-seems-consistently-slow-500-650ms/41000876#41000876)。 – icza

+0

我认为这可以帮助https://stackoverflow.com/questions/18650890/keeping-open-a-mongodb-database-connection。在我的情况下,我使用go和bigtable,并且保持连接活动(除非/直到服务器崩溃)。 – mayo

+0

非常感谢你,非常感谢:-) – j3d

回答

1

main package docs

新的会话通常是通过调用session.Copy上在拨号时获得的 初始会话创建。这些新的会话将共享 相同的集群信息和连接池,并且可能很容易将 交给组织逻辑的其他方法和函数。每创建一个会话都必须在其生命周期结束时调用它的Close方法,因此其资源可能会放回池中或收集起来,取决于具体情况。

含义:在启动时,你应该Dial并保存会话,并为每个调用NewUserDAO你应该CloneDial创建初始Session