我编写了一个使用 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 服务调用中,数据库会话可能不再有效?人们如何处理这些情况以检测会话不再有效并且应该建立一个“新”会话?
1 回答
HUH函数
TA贡献1836条经验 获得超4个赞
您可能想要的是.Copy()
为每个传入的 HTTP 请求(使用 defered .Close()
)执行会话,如果需要,请从处理程序中的新会话再次复制..
连接和重新连接由 mgo 管理,您可以停止和重新启动 MongoDB,同时向您的 Web 服务发出 HTTP 请求以查看其影响。
如果在处理 HTTP 请求时出现数据库连接问题,数据库操作最终将超时(超时可以通过使用DialWithTimeout
而不是常规配置Dial
,因此在这种情况下您可以使用 5xx HTTP 错误代码进行响应。
- 1 回答
- 0 关注
- 147 浏览
添加回答
举报
0/150
提交
取消