2016-05-05 10 views
1

Ich habe schon ein bisschen herumgespielt und ich liebe es, aber es scheint ein paar Dinge zu haben, die es anders als in anderen Sprachen macht. Also schreibe ich eine Web-App, die MongoDb mit dem mgo-Paket verwendet. Ich frage mich, was die beste Vorgehensweise ist, um eine Datenbanksitzung für die Verwendung in anderen Paketen (meine Modelle) offen zu halten.Gibt es eine Standardmethode, um eine Datenbanksitzung über Pakete in Golang hinweg offen zu halten?

Fühlen Sie sich frei, mich auf irgendwelche falschen Ideale zu korrigieren, die ich haben könnte, ich habe nur begonnen, GO zu verwenden.

Heres, was ich denke:

package main 

import(
    ds "api-v2/datastore" 
) 

type Log struct { 
    Name string 
} 

func main() { 
    sesh := ds.Sesh 

    err = &sesh.Insert(&Log{"Ale"}) 
} 

Und in meinem Datenspeicher-Paket:

package datastore 

import(
    "gopkg.in/mgo.v2" 
) 

var Sesh = newSession() 

func newSession() **mgo.Session { 
    session, err := mgo.Dial("localhost") 
    if err != nil { 
     panic(err) 
    } 

    return &session 
} 

Dank!

+1

Sehen Sie, ob diese Antwort hilfreich ist. [Link] (http://stackoverflow.com/a/26576589/2285935) –

+0

Sie erstellen ein Paket, das die Sitzung als eine lokale Variable startet. Dann erstellen Sie eine Funktion, die diese Variable erhält und schließen Sie sie dann, wenn Sie fertig sind. Ich werde etwas Code zur Verfügung stellen, wenn ich zu meinem Desktop komme – CESCO

Antwort

1

Nach mgo ‚s Dokumentation, https://godoc.org/gopkg.in/mgo.v2:

jeder Sitzung erstellt wird, muss seine Close-Methode am Ende seiner Lebenszeit ordnungsgemäß genannt haben, so seine Ressourcen zurück in den Pool gestellt werden kann oder gesammelt, je am Fall.

Die Close() müssen aufgerufen werden, solange die Jobs erledigt sind. Und wenn die Methode aufgerufen wird, wird die Sitzung an den Pool zurückgegeben.

Auch an ihrem Quellcode suchen (https://github.com/go-mgo/mgo/blob/v2-unstable/session.go#L161), gibt es einige Kommentare auf der Dial Methode

// This method is generally called just once for a given cluster. Further 
// sessions to the same cluster are then established using the New or Copy 
// methods on the obtained session. This will make them share the underlying 
// cluster, and manage the pool of connections appropriately. 
// 
// Once the session is not useful anymore, Close must be called to release the 
// resources appropriately. 

Dial Methode nur braucht einmal für einen einzelnen Cluster. Verwenden Sie New oder Copy für nachfolgende Sitzungen, sonst werden Sie nicht von den Vorteilen des Verbindungspools profitieren.

--- --- Aktualisiert

Ich habe versucht, ein Beispiel zu erstellen, aber ich fand, dass die Verbindung von @John S Perayil ‚s Kommentar hat eine ganz ähnliche Idee.

Was ich Ihnen ist, dass die Dial Methode stressen wollte nur einmal während des Startvorgangs aufrufen sollte, ist es eine gute Idee, es in ein init Methode zu setzen. Und dann könnten Sie eine Methode erstellen (zB newSession), die session.Copy() zurückgibt.

Das ist also, wie Sie die Methode nennen würde:

func main() { 
    session := ds.NewSession() 
    defer session.Close() 

    err = &session.Insert(&Log{"Ale"}) 
} 

Irgendwie merkte ich, dass Sie nicht defer session.Close() in Ihrem Code aufrufen haben, defer den Code unmittelbar vor dem Ende der Ausführung für diese Methode ausführen .

+0

Danke für die Hilfe! Können Sie ein Codebeispiel angeben? – CloudyHLS

Verwandte Themen