Best practice zur Aufrechterhaltung eines mgo-Sitzung
Ich bin derzeit mit einem mongodb mit mgo-lib für eine web-Anwendung, aber ich bin mir nicht sicher, ob der Weg, den ich verwende, ist gut ..
package db
import (
"gopkg.in/mgo.v2"
)
const (
MongoServerAddr = "192.168.0.104"
RedisServerAddr = "192.168.0.104"
)
var (
MongoSession, err = mgo.Dial(MongoServerAddr)
MDB = MongoSession.DB("message")
MCol = MDB.C("new")
MSav = MDB.C("save")
UDB = MongoSession.DB("account")
UCol = UDB.C("user")
)
Ich init der db-session und erstellen von Variablen, die sich die Sammlung und Dokument Wert,
wenn ich also die Abfrage eine collection, die ich mit der Variablen zu machen.
So :
func UserExist(username string) bool {
user := Users{}
err := db.UCol.Find(bson.M{"username": username}).One(&user)
if err != nil {
return false
} else {
return true
}
}
Gibt es also ein best practice oder diese in Ordnung ist ..?
Dank
Es ist besser, Praxis, eine Funktion verwenden, für die Einrichtung der Datenbank-session als Variablen-Deklarationen. Ein Grund, um eine Funktion zu verwenden ist, können Sie den Fehler behandeln Rückkehr aus Dial. Für UserExist, würde ich die Anzahl der Dokumente in der Ergebnismenge, um zu bestimmen, ob ein Dokument vorhanden ist. Es gibt keine Notwendigkeit zu Holen, das eigentliche Dokument.
danke für den Tipp für die UserExist Funktion! Aber mit der Funktion, die zur Initialisierung des session-Anschluss ist, kann ich es tun, mit "func init()" in das db-Paket und weisen Sie der globalen Variablen für db-und die Sammlung mit der return-Sitzung ? Ich bin nur nicht sicher, wie Sie Sie pflegen meine Sitzung mit der db öffnen, ohne dass eine "mgo.Dial()" jedes mal, wenn ich es brauche, und habe auch meine db-Sammlung bereits initialisiert ...
danke für den Tipp für die UserExist Funktion! Aber mit der Funktion, die zur Initialisierung des session-Anschluss ist, kann ich es tun, mit "func init()" in das db-Paket und weisen Sie der globalen Variablen für db-und die Sammlung mit der return-Sitzung ? Ich bin nur nicht sicher, wie Sie Sie pflegen meine Sitzung mit der db öffnen, ohne dass eine "mgo.Dial()" jedes mal, wenn ich es brauche, und habe auch meine db-Sammlung bereits initialisiert ...
InformationsquelleAutor JonathanChaput | 2014-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, nicht mit einem global-Sitzung so. Erstellen Sie stattdessen eine Art, die verantwortlich ist für die Datenbank-Interaktion. Zum Beispiel:
Gibt es viele Vorteile für das design. Wichtig ist, dass es ermöglicht, mehrere Sitzungen im Flug zur gleichen Zeit, also, wenn Sie einen http-handler, zum Beispiel, können Sie erstellen Sie eine lokale Sitzung, unterstützt von einem unabhängigen session nur für diese eine Anfrage:
Der mgo-Treiber verhält sich schön in diesem Fall, wie Sitzungen werden intern zwischengespeichert und wieder verwendet/verwaltet. Jede Sitzung wird auch unterstützt von einem unabhängigen Buchse, während im Einsatz, und kann haben unabhängige Einstellungen konfiguriert, und auch unabhängig Fehlerbehandlung. Diese Fragen werden Sie schließlich zu bewältigen haben, wenn Sie einen einzigen globalen session.
session.Copy()
call ist besonders wichtig, und etwas, das nicht genug betont, um die Menschen über die Mongo-Treiber in Gehen, da es erlaubt dem Fahrer, um den vollen nutzen von Parallelität. Aber dann - Sie wissen alles über das .. 😛 +1Kurze Frage. Was ist die WebSite-Typ, den Sie verwenden? Und kennt Ihr irgendwelche tutorials, die zeigen, dass diese Art von Ansatz?
Lassen Sie mich das klarstellen: wenn ich mit 5000reqs/Sek I offen bis 5000 db-Sitzungen pro Sekunde? Ist das richtig?
Sie sind nicht zu erklären, wo die erste Sitzung sollte initialisiert werden, und, was die definition von
WebSite
istNein, tut es nicht.
mgo
verwendet einen internen pool von socket-verbindungen zu mongodb. auf jedensession.Copy()
, es werde von dort.InformationsquelleAutor Gustavo Niemeyer
Zwar nicht direkt deine Frage zu beantworten, in Bezug auf mgo-Sitzung überprüfen, die Sie verwenden müssen, zurückstellen/wiederherstellen da mgo Anrufe (auch mgo.Sitzung.Ping) Panik. Soweit ich das beurteilen kann gibt es keine andere Möglichkeit, zu überprüfen, mgo session state (mgo godocs). Sie können Gustavo Niemeyer's Vorschlag, und fügen Sie eine Methode hinzu, die auf Ihrem
DataStore
geben.Wie funktioniert die middleware dies erreichen? DataStore.Ping?
Wenn es helle Panik, Blick auf die Fehlermeldung und schließen Sie es wieder an.
Hast du ein Beispiel von einem Verwerter middleware?
Ich schrieb meine eigenen für MongoDb allerdings gibt es eine generische Beispiel hier.
InformationsquelleAutor Zamicol
Mit 1.7 gehen, die meisten idiomatischen Umgang mit mongo-session auf einem webserver ist die Verwendung des neuen standard-Bibliothek-Paket
context
zu schreiben, eine middleware, die befestigen kanndefer session.Close()
zu, wenn der Antrag Kontext Done() aufgerufen wird. So müssen Sie nicht daran erinnern zu schließenWelche Methode ist die beste Art und Weise zu handhaben mongo-Sitzung? Ich sehe durchaus ein paar Beispiele für die Verwendung von Kontext-und mongo-Sitzungen.
Sie können einfach kopieren Sie die Sitzung aus einem injizierten struct-member zum Beispiel die Linie nach unten.
InformationsquelleAutor CESCO