abgeschlossen Die gleiche AccountId wird den Anruf fast gleichzeitig tätigen (sie werden alle mit einer Übertragung benachrichtigt).Pause gleichzeitiger REST ruft, bis erste
In der Methode wird die Ergebnismenge für 10 Sekunden zwischengespeichert, da ein Nahzeitergebnis für alle Personen, die die Anforderung innerhalb dieses Fensters stellen, in Ordnung ist. Da jedoch alle gleichzeitig den Anruf tätigen (wiederum für eine bestimmte AccountID), wird der Cache nie von vorn besetzt, so dass jeder den Datenbankaufruf durchführt.
Also meine Frage ist, innerhalb der Methode, wie kann ich alle eingehenden Anfragen für eine bestimmte accountId Pause und sie alle für das erste Ergebnis warten vervollständigen gesetzt, so dass der Rest der Anrufe, die im Cache gespeicherten verwenden können Ergebnismenge?
Ich habe ein wenig über Monitor.Pulse und Monitor.Lock gelesen, aber die Implementierung für eine per-AccountId Sperre entgeht mir irgendwie. Jede Hilfe würde sehr geschätzt werden.
gibt es einen Grund, warum viele Benutzer die gleiche AccountId verwenden, ist, dass ein Dienstkontonummer ..? Können Sie Ihre gespeicherte Prozedur ändern, um Transaktionen zu verwenden oder einen 'With No Lock'-Befehl an die Datenbank hinzuzufügen, vorausgesetzt, Sie verwenden Sql Server ..? – MethodMan
Ich würde einen 2-Level-Cache, also wenn Sie einen zweiten Cache von "ausstehend", dass die letzten 10 20 Sekunden dann alle Anrufe, die derzeit in der schwebenden Cache sind selbst Blockierung und warten ein bisschen, bevor Sie den tatsächlichen db-Aufruf. Sie können aus einem ähnlichen Grund ähnlich "bewiesen nicht existieren" zwischenspeichern. Ich würde Monitor und Sperre basierend auf dem Wert der Variablen vermeiden. Ich würde diese Sperren und Synchronisierer für Code und Speicher reservieren, unabhängig vom Wert der Variablen. –