Frage

Im Moment arbeite ich an einem Projekt Admin-Anwendung in C # 3.5 auf ASP.net. Um Zugriffe auf die Datenbank zu reduzieren, ich bin das Caching vielen Informationen über statische Variablen. Zum Beispiel wird eine Liste der Benutzer im Speicher in einer statischen Klasse gehalten. Die Klasse liest alle Informationen aus der Datenbank beim Start, und die Datenbank aktualisieren, wenn Änderungen vorgenommen werden, aber es muss nie von der Datebase lesen.

Die Klasse Pings andere Web-Servern (falls vorhanden) mit aktuellen Informationen zur gleichen Zeit als Schreib auf die Datenbank. Der Pingen Mechanismus ist ein Windows-Dienst, zu dem die Cache-Objekt-Registern eines zufällig verfügbar Port. Es ist auch für andere Dinge verwendet.

Die Datenmenge ist nicht so toll. Ich verwende es im Moment nur die Benutzer (Passwort-Hashes, Berechtigungen, Namen, E-Mail etc.) zwischenzuspeichern Es speichert nur einen Stapel von Anrufen in die Datenbank vorgenommen werden.

ich mich gefragt, ob es irgendwelche Gefahren dieser Methode sind und / oder wenn es bessere Möglichkeiten, um die Daten zu cachen?

War es hilfreich?

Lösung

A pitfall: Ein statisches Feld pro Anwendungsdomäne scoped ist und eine erhöhte Belastung der Server mehr Anwendungsdomänen im Pool generieren machen. Dies ist nicht unbedingt ein Problem, wenn man nur von der Statik lesen, aber werden Sie doppelte Daten im Speicher, und Sie werden einen Hit jedes Mal, wenn eine Anwendungsdomäne erstellt oder recycelt erhalten.

besser auf das Cache-Objekt zu verwenden - es ist für Dinge wie dies bestimmt ist

.

Edit: Es stellt sich heraus, ich war falsch über AppDomains (wie in Kommentaren darauf hingewiesen) - mehr Instanzen der Anwendung wird unter Last erzeugt werden, aber sie werden alle laufen in derselben AppDomain. (Aber Sie sollten immer noch das Cache-Objekt verwenden!)

Andere Tipps

Solange man kann erwarten, dass der Cache nie auf eine Größe größer als die Menge des verfügbaren Speichers wachsen, es ist in Ordnung. Auch sicher sein, dass es eine Instanz dieser Anwendung nur pro Datenbank sein wird, oder die Caches in den verschiedenen Instanzen der App konnte mit dem „out of sync fallen.“

Wo ich arbeite, haben wir eine homegrown O / RM, und wir tun etwas Ähnliches, was Sie mit bestimmten Tabellen tun, die voraussichtlich nicht viel wachsen oder ändern. Also, was Sie tun, ist nicht beispiellos, und in der Tat in unserem System ist erprobt und wahr.

Ein weiteres Pitfall Sie berücksichtigen müssen, ist die Thread-Sicherheit. Alle Ihre Anwendungsanforderungen werden in derselben AppDomain läuft, aber auf verschiedenen Threads kommen. eine statische Variable zugreift, muss es für Konto von mehreren Threads zugegriffen wird. Wahrscheinlich Overhead ein bisschen mehr als das Sie suchen. Cache-Objekt ist für diesen Zweck besser.

Hmmm ... Die „klassische“ Methode wäre die Anwendung Cache, aber vorausgesetzt, Sie nie die statischen Variablen aktualisieren, oder die Probleme mit Sperren verstehen, wenn Sie tun, und Sie verstehen, dass sie jederzeit mit einem Appdomain Neustart verschwinden können dann ich sehe nicht wirklich den Schaden in einem statischen verwendet wird.

Ich schlage vor, Sie suchen nach Möglichkeiten, einen verteilten Cache für Ihre Anwendung ist. Sie können einen Blick auf NCache oder indeXus.Net

Der Grund, warum ich das vorgeschlagen ist, weil Sie Ihren eigenen Ad-hoc-Weg gerollt Informationen zu aktualisieren, die Sie Caching. Statische Variablen / Referenzen sind in Ordnung, aber sie werden nicht aktualisiert / aktualisieren (so werden Sie auf Ihrem eigenen Altern zu behandeln haben) und Sie scheinen ein verteiltes Setup zu haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top