2010-06-18 13 views
11

Ich habe eine C# WinForms-Anwendung mit einem Datenbank-Backend (Oracle) und verwenden NHibernate für O/R-Zuordnung. Ich möchte die Kommunikation zur Datenbank so weit wie möglich reduzieren, da das Netzwerk hier ziemlich langsam ist, also lese ich über Second-Level-Caching. Ich fand this quite good introduction, die die folgenden verfügbaren Cache-Implementierungen auflistet.NHibernate der Cache für WinForms-Anwendung verwenden

Ich frage mich welche Implementierung ich für meine Anwendung verwenden sollte.

Das Zwischenspeichern sollte einfach sein, es sollte das erste Auftreten einer Abfrage nicht wesentlich verlangsamen, und es sollte nicht viel Speicher belegen, um die implementierenden Assemblys zu laden. (Mit NHibernate und Schloss, nimmt die Anwendung bereits auf 80 MB RAM!)

  • Geschwindigkeit: verwendet Microsoft Geschwindigkeit, die ein hoch skalierbare In-Memory ist Anwendungs-Cache für alle Arten von Daten.
  • Prävalenz: verwendet Bamboo.Prevalence als Cache-Provider. Bamboo.Prävalence ist eine .NET-Implementierung des von Klaus Wüstefeld in Prevayler ins Leben gerufenen Objektprävalenzkonzepts. Bamboo.Prevalence bietet eine transparente Objektpersistenz für deterministische Systeme, die auf die CLR abzielen. Es bietet permanentes Caching für Smart-Client-Anwendungen.
  • SysCache: Verwendet System.Web.Caching.Cache als Cache-Provider. Dies bedeutet, dass Sie sich auf das ASP.NET-Caching-Feature verlassen können, um zu verstehen, wie es funktioniert.
  • SysCache2: Ähnlich wie NHibernate.Caches.SysCache verwendet ASP.NET-Cache. Dieser Provider unterstützt auch den SQL-Abhängigkeits-basierten Ablauf, dh es ist möglich, bestimmte Cache-Bereiche so zu konfigurieren, dass sie automatisch ablaufen, wenn sich die relevanten Daten in der Datenbank ändern.
  • MemCache: verwendet memcached; memcached ist ein leistungsstarkes, verteiltes Speicherobjekt-Cachesystem, das generischen Ursprungs ist, jedoch zur Beschleunigung dynamischer Webanwendungen durch Entlastung der Datenbank gedacht ist. Im Grunde eine verteilte Hash-Tabelle.
  • SharedCache: hochperformantes, verteiltes und repliziertes Caching-System für Speicherobjekte. Siehe hier und hier für weitere Informationen

Meine bisherigen Überlegungen waren:

  • Geschwindigkeit scheint ziemlich Schwergewicht und viel des Guten (die Dateien vollständig nehmen 467 KB Speicherplatz, haben nicht die RAM gemessen es dauert so weit, weil ich es nicht geschafft habe, es laufen zu lassen, siehe unten)
  • Prävalenz verlangsamt, zumindest in meinem ersten Versuch, meine Abfrage von ~ 0,5 Sekunden auf ~ 5 Sekunden, und Caching hat nicht funktioniert (siehe unten)
  • SysCache scheint für ASP.NET zu sein, nicht für Winforms.
  • MemCache und SharedCache scheinen für verteilte Szenarien zu sein.

Welchen würden Sie mir vorschlagen, zu verwenden? Es würde auch eine eingebaute Implementierung geben, die natürlich sehr leicht ist, aber der referenzierte Artikel sagt mir, dass "(...) niemals diesen Cache-Provider für Produktionscode verwenden sollte, sondern nur zum Testen.„

Neben der Frage, die am besten in meiner Situation passt ich auch Probleme konfrontiert mit ihnen Anwendung:

  • Geschwindigkeit darüber beschwert, dass“ dcacheClient“Tag in der Anwendungskonfigurationsdatei nicht angegeben Geben Sie einen gültigen Tag. in der Konfigurationsdatei, "obwohl ich eine app.config-Datei für die Baugruppe erstellt und das Beispiel von this article eingefügt.

  • Die Häufigkeit, wie oben erwähnt, verlangsamte meine erste Abfrage stark, und das nächste Mal, als genau die gleiche Abfrage ausgeführt wurde, wurde eine andere Auswahl an die Datenbank gesendet. Vielleicht sollte ich dieses Thema in einen anderen Beitrag "externalisieren". Ich werde das tun, wenn jemand mir sagt, dass es absolut ungewöhnlich ist, dass eine Anfrage so sehr verlangsamt wird und er weitere Details benötigt, um mir zu helfen.

+0

Der Link zum guten Einstieg zu reduzieren arbeiten Ich denke, dass Hibernating Rhinos Dinge bewegt haben. Nach ein wenig Suche fand ich [diesen Beitrag] (http://nhibernate.hibernatingrhinos.com/28/first-and-second-level-caching-in-nhibernate), was ich denke, ist der eine, auf den hier Bezug genommen wird. –

+0

@John: Danke für die Kündigung, habe den Link entsprechend aktualisiert. Es ist genau dieser Artikel. – chiccodoro

Antwort

3

SysCache verwendet den "ASP.NET" Cache nur, weil sie die einzige mit 2.x/3.x .NET enthalten ist

(.NET 4 eine separate System.Runtime.Caching Baugruppe umfasst)

Es kann ohne Probleme in Desktop-Anwendungen verwendet werden (ich verwende es gerade), und es erfordert fast keine Konfiguration.

Nun scheint Ihre Erinnerung Überlegungen mit diesem Jahrhundert ein wenig aus. Keine Maschine wurde in den letzten Jahren mit weniger als 1 GB ausgeliefert, und die meisten haben zwischen 2 GB und 8 GB, so dass 80 MB im Wesentlichen nichts sind. Der Browser, in dem ich schreibe, benötigt 220MB.

Die sehr Essenz von Caching über die Verwendung einer Ressource ist (in der Regel Speicher, Festplatten in sehr speziellen Fällen) nicht mehr nicht die Verwendung eines langsameren (Netzwerk)

+0

Hallo Diego. Du hast irgendwie recht, was Erinnerung betrifft. Natürlich erwarte ich nicht, dass die zwischengespeicherten Daten keinen Speicher belegen, aber nicht mögen, wenn das Laden der Assemblies bereits so viel kostet. Tatsächlich sind die PCs, mit denen ich konfrontiert bin, teilweise ziemlich alt, und auch die Anwendung muss jedes Mal, wenn wir eine neue Version (ClickOnce) bereitstellen, aus dem Netzwerk geladen werden, so dass Speicherplatz ebenfalls ein Problem ist. – chiccodoro

Verwandte Themen