我編寫了一個(gè)使用 mongo 作為后端數(shù)據(jù)存儲(chǔ)的 REST Web 服務(wù)。我想知道在這個(gè)階段(部署之前),考慮到一個(gè)基本上永遠(yuǎn)運(yùn)行的服務(wù)(ish),最佳實(shí)踐是什么。目前,我正在遵循這種模式:// 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) ...}我的問題是 - 從超時(shí)、丟失連接的會(huì)話中恢復(fù)的推薦做法是什么(我使用的 mongo 服務(wù)提供商是遠(yuǎn)程的,所以我假設(shè)這會(huì)發(fā)生),所以在任何特定的 Web 服務(wù)調(diào)用中,數(shù)據(jù)庫會(huì)話可能不再有效?人們?nèi)绾翁幚磉@些情況以檢測(cè)會(huì)話不再有效并且應(yīng)該建立一個(gè)“新”會(huì)話?
1 回答

HUH函數(shù)
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可能想要的是.Copy()
為每個(gè)傳入的 HTTP 請(qǐng)求(使用 defered .Close()
)執(zhí)行會(huì)話,如果需要,請(qǐng)從處理程序中的新會(huì)話再次復(fù)制..
連接和重新連接由 mgo 管理,您可以停止和重新啟動(dòng) MongoDB,同時(shí)向您的 Web 服務(wù)發(fā)出 HTTP 請(qǐng)求以查看其影響。
如果在處理 HTTP 請(qǐng)求時(shí)出現(xiàn)數(shù)據(jù)庫連接問題,數(shù)據(jù)庫操作最終將超時(shí)(超時(shí)可以通過使用DialWithTimeout
而不是常規(guī)配置Dial
,因此在這種情況下您可以使用 5xx HTTP 錯(cuò)誤代碼進(jìn)行響應(yīng)。
- 1 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)
0/150
提交
取消