2016-04-05 15 views
3

Ich benutze MongoDB (gopkg.in/mgo.v2 Paket) als eine Datenbank in meiner App zu gehen. Gemäß den Best Practices von MongoDB sollte ich die Verbindung beim Starten der Anwendung öffnen und sie schließen, wenn die Anwendung beendet wird. Um zu überprüfen, wird die Verbindung geschlossen werden, ich defer Konstruktion verwenden kann:Wie funktioniert die MongoDB-Sitzung in Go richtig?

session, err := mgo.Dial(mongodbURL) 
if err != nil { 
    panic(err) 
} 
defer session.Close() 

Alles wird gut sein, wenn ich diesen Code in main Funktion auszuführen. Aber ich möchte diesen Code in separaten go-Datei haben. Wenn ich das mache, wird diese Sitzung geschlossen, nachdem die Methode ausgeführt wurde. Was ist der beste Weg, die Sitzung in Golang nach MongoDB Best Practices zu öffnen und zu schließen?

Antwort

4

Sie können so etwas tun. Erstellen Sie ein Paket, das die Db Initialisierung

package common 

    import "gopkg.in/mgo.v2" 

    var mgoSession *mgo.Session 

    // Creates a new session if mgoSession is nil i.e there is no active mongo session. 
    //If there is an active mongo session it will return a Clone 
    func GetMongoSession() *mgo.Session { 
     if mgoSession == nil { 
      var err error 
      mgoSession, err = mgo.Dial(mongo_conn_str) 
      if err != nil { 
       log.Fatal("Failed to start the Mongo session") 
      } 
     } 
     return mgoSession.Clone() 
    } 

Clone wieder verwendet die gleiche Buchse wie die ursprüngliche Sitzung der Fall ist.

Jetzt in anderen Paketen Sie diese Methode aufrufen können:

package main 

session := common.GetMongoSession() 
defer session.Close() 
+0

Es funktioniert, danke! – Cortwave

+0

Brauchen wir eigentlich eine Abschlusssitzung, wenn wir es mit Clone() gemacht haben? –

2

Führen Sie den Abschnitt zum anderen Teil des Codes nach dem Zurückstellungs(),

func main(){ 
    // ... other stuff 
    session, err := mgo.Dial(mongodbURL) 
     if err != nil { 
     panic(err) 
     } 
    defer session.Close() 
    doThinginOtherFile(session) 
} 

Es sieht aus wie Sie können Clone/Copy-Sessions, wenn nötig, solange Sie einen Clone haben.