Ich arbeite an einem komplexen Projekt mit einer verteilten Anwendung, die das Zwischenspeichern von SQL-Abfragen erfordert: Da ich das iBatis-Framework verwende, möchte ich Memcached - der Systemadministrator benötigt es - als Caching-Engine verwenden. Ist das möglich? Wenn ja, kennt jemand bestehende Lösungen/Implementierungen? Ich weiß bereits, dass OSCACHE auch in Clustern funktioniert, aber ich würde gerne wissen, ob es möglich ist, die bestehende Architektur zu verwenden, bevor ich auf eine neue umsteige. Vielen Dank im Voraus!!!
Antworten
Zu viele Anzeigen?Interessante Frage!
iBatis liefert eine oder mehrere JavaBeans, die wiederum verschachtelte Listen von JavaBeans enthalten können. Eine JavaBean ist einfach ein Java-Objekt, das bestimmte einfache Kongresse Eine davon ist, dass es die Schnittstelle Serializable implementiert. Wenn dies der Fall ist, können Sie serialisieren eine JavaBean-Struktur in eine Zeichenkette und deserialisieren diese Zeichenkette zurück in eine tiefe Kopie der ursprünglichen JavaBean-Struktur.
Nehmen wir also an, Sie stellen sicher, dass alle Ihre Ergebnisobjekte als "implement Serializable" deklariert sind. JavaBeans haben eine so einfache Struktur, dass die Standardmechanismen zur Serialisierung/Deserialisierung von Java-Objekten nicht überschrieben werden müssen, was gut ist.
Diese serialisierten Strings sind die Werte die Sie in die verteilte Hash-Map Ihres Memcached-Clusters eingeben. In jeder Ihrer Java-Methoden, die eine Abfrage ausführt und deren Ergebnisse zurückgibt, suchen Sie zunächst nach dem vorhandenen Ergebnis in memcached, und wenn es es vorhanden und noch nicht abgelaufen ist, deserialisieren Sie es in die JavaBeans, die (vermutlich) Ihre Abfrage zurückgegeben hätte. Wenn das Abfrageergebnis no in memcached gefunden, dann fragen Sie die Datenbank über iBatis ab, aber bevor Sie das Ergebnis zurückgeben, serialisieren Sie es in einen String und speichern diesen Wert in memcached.
Die nächste Frage ist, was für das Memcached-Abfrageergebnis verwendet werden soll Tasten . Etwas wie
YourIbatisQueryName + ":" + FirstParameterValue + ":" + SecondParameterValue
sollte funktionieren (z. B. "SelectStackOverflowReputation:Simone:Tripodi").
Sie sind fast fertig. Der letzte Schritt besteht darin, herauszufinden, wie lange ein Abfrageergebnis zwischengespeichert werden kann, ohne ungültig zu werden. Vielleicht können Sie für jede Abfrage eine andere Ablaufzeit festlegen, oder Sie benötigen einen manuellen Mechanismus zur Ungültigkeitserklärung des Caches. Das Zwischenspeichern von Abfrageergebnissen, auch wenn es nur wenige Minuten dauert, kann sehr starke Auswirkungen auf die Skalierbarkeit Ihrer Anwendung haben.
Hinweis: Eine Variante dieses Ansatzes besteht darin, nicht die standardmäßige Java-Serialisierung, sondern XML, JSON oder ein anderes Format zu verwenden. Wenn Sie sich für XML oder JSON entscheiden, sollten Sie sich mit einem Serialisierungs-Framework wie XStream um Ihre JavaBeans in XML-Strings zu serialisieren/deserialisieren und wieder zurück.