ホームページ >バックエンド開発 >Golang >MGO を使用して Go で MongoDB 接続障害から正常に回復する方法

MGO を使用して Go で MongoDB 接続障害から正常に回復する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-14 14:53:02753ブラウズ

How to Gracefully Recover from MongoDB Connection Failures in Go with MGO?

MGO を使用した Go での 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 ステートメント内で、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。