在 Go 中使用 MGO 从 MongoDB 连接失败中恢复
在 Go 中,MGO 包用于与 MongoDB 交互。但是,连接 MongoDB 有时会失败,导致程序出现恐慌。本文提供了一种从此类连接失败中正常恢复的解决方案。
以下函数尝试连接到 MongoDB,如果成功则返回会话和集合:
func connectToMongo(sess *mgo.Session, coll *mgo.Collection, sessionErr error) bool { fmt.Println("enter main - connecting to mongo") defer func() { if r := recover(); r != nil { fmt.Println("Detected panic") var ok bool err, ok := r.(error) if !ok { fmt.Printf("pkg: %v, error: %s", r, err) } } }() maxWait := time.Duration(5 * time.Second) session, sessionErr = mgo.DialWithTimeout("localhost:27017", maxWait) if sessionErr == nil { session.SetMode(mgo.Monotonic, true) coll = session.DB("MyDB").C("MyCollection") if coll != nil { fmt.Println("Got a collection object") return true } } else { // never gets here fmt.Println("Unable to connect to local mongo instance!") } return false }
原始问题代码是在 defer 函数执行之前紧急中断程序。要解决此问题,应在尝试连接后在 defer 语句内调用recover() 函数。
修改后的代码:
var mongoUp bool func init() { if ( connectToMongo() ) { mongoUp := true fmt.Println("Connected") } else { mongoUp = false fmt.Println("Not Connected") } }
当 MongoDB 运行时,程序成功连接并将 mongoUp 设置为 true。当 MongoDB 未运行时,程序会记录失败并将 mongoUp 设置为 false。
此解决方案允许程序优雅地处理 MongoDB 连接失败并继续执行而不会崩溃。
以上是如何使用 MGO 从 Go 中的 MongoDB 连接故障中优雅地恢复?的详细内容。更多信息请关注PHP中文网其他相关文章!