我编写了一个使用mongo作为后端数据存储的REST Web服务。我想在这个阶段(部署之前),最好的做法是什么,考虑到一个基本上永远运行的服务(ish)。
目前,我正在遵循这种模式:
// database.go
...
type DataStore struct {
mongoSession *mgo.Session
}
...
func (d *DataStore) OpenSession () {
... // read setup from environment
mongoSession, err = mgo.Dial(mongoURI)
if err != nil {}
...
}
func (d *DataStore) CloseSession() {...}
func (d *DataStore) Find (...) (results...) {
s := d.mongoSession.Copy()
defer s.Close()
// do stuff, return results
}
在main.go中:
func main() {
ds := NewDataStore()
ds.OpenSession()
defer ds.CloseSession()
// Web Service Routes..
...
ws.Handle("/find/{abc}", doFindFunc)
...
}
我的问题是 - 建议的从会话中恢复的做法是什么时候超时,连接丢失(我使用的mongo服务提供商是远程的,所以我认为这会发生),所以在任何特定的Web服务调用上,数据库会话可能不再起作用?人们如何处理这些案件以检测会话不再有效以及"新鲜"应该建立一个吗?
谢谢!
答案 0 :(得分:2)
您可能想要的是为每个传入的HTTP请求(带有被拒绝的.Copy()
)执行会话.Close()
,如果需要,再次从处理程序中的新会话进行复制..
连接和重新连接由mgo管理,您可以在向Web服务发出HTTP请求时停止并重新启动MongoDB,以查看其受影响的方式。
如果在处理HTTP请求时出现数据库连接问题,db操作最终会超时(可以使用DialWithTimeout
而不是常规Dial
来配置超时,这样您就可以响应在这种情况下使用5xx HTTP错误代码。