2012-04-02 8 views
3

Wir verwenden RavenDB für unsere Website. Die Seite lädt alle ihre Daten in den Speicher (nicht sehr viel), um mit massiven Lasten umgehen zu können. Wir laden die Daten in einen Hintergrund-Thread, der regelmäßig mit dem DB (RavenDB + sqlserver) überprüft, ob neue Daten vorhanden sind und lädt diese Daten in den Speicher.ravendb lang laufende Sitzungen

Wir haben viele Dinge probiert, um die lästige Anforderungsgrenze von 30 Abfragen in RavenDB pro Sitzung zu umgehen. Da Raven keinen Mechanismus hat, um die Sitzung "zurückzusetzen", nachdem wir mit einer Iteration der Check/Load-Schleife fertig sind, und da es keine Möglichkeit gibt, Structuremap zu sagen, wollen wir wirklich eine neue Sitzung, obwohl wir es sind immer noch der gleiche Thread wie vorher, wir stecken irgendwie fest.

Am Ende habe ich rearchitected, so dass unsere Repositories jetzt eine RavenSessionProxy verwenden, welche Strukturkarte für uns lädt, die durch die Load/Fetch-Schleife zurückgesetzt werden kann (die eine neue Dokumentsitzung manuell initialisiert, wenn wir sie zurücksetzen).

Ist das wirklich der einzige Weg? Gibt es keinen Mechanismus in Raven, der sagt: "Hey, Mr. Session, ich bin jetzt fertig mit dir, geh und spüle dich selbst und sei frisch und bereit, wenn ich dich das nächste Mal anrufe" oder Structuremap zu sagen "Hey, SM! Ich bitte Sie um eine IDocumentSession, bringen Sie mir eine neue, ich bin müde von dieser alten "

Antwort

1

AndreasKnudsen, RavenDB-Sitzung sind entworfen, um relativ kurzlebig zu sein. Wenn Sie sie eine Weile herumtragen müssen, tun Sie wahrscheinlich etwas falsch. Beachten Sie, dass RavenDB bereits viel tut, um sicherzustellen, dass es schnell ist, so dass das Laden von Daten in den Speicher nicht erforderlich ist.

Sie können session.Advanced.MaxNumberOfRequests festlegen, was die Anzahl der Anforderungen erhöht, die Sie ausführen können, aber es bedeutet auch, dass Sie mehr Daten im Speicher behalten.

+0

MaxNumberOfRequests würde nur das Problem verschieben, der Punkt ist, dass ich möchte, dass die Sitzung für immer dauern, nur in regelmäßigen Abständen selbst zurücksetzen. Nicht * alle * Anwendungsfälle sind für einzelne Anfragen, die bis zu 30 Abfragen durchführen und dann absterben. mein Hintergrundladen ist * angeblich * um für immer zu leben – AndreasKnudsen

4

Wie Ayende betont hat, sollten Sitzungen nur von kurzer Dauer sein. Erlauben Sie nicht, dass Ihr Hintergrundjob eine Abhängigkeit von einer Sitzung herstellt, eine Abhängigkeit von IDocumentStore und erstellen/entsorgen Sie dann die Sitzung für jeden Lauf. IDocumentStore kann ein Singleton sein, der beim Start in den Container eingefügt wird.