Caching in Java-EE-Anwendung
Ich benutze JBoss AS. Ich habe eine lange und schwere SQL innerhalb der Anwendung-server. Ich möchte zum Zwischenspeichern der Ergebnisse basierend auf dem input-Parameter.
Habe ich ein paar Optionen hier:
-
Verwenden eine caching-manager und manuell setzen die Ergebnisse in den cache.
-
Verwenden eine caching-manager mit loader wird "laden", um die Ergebnisse in den cache, wenn es keine Ergebnisse im cache.
Ich interessiere mich nicht für jetzt über die Replikation des cache auf anderen Servern im cluster.
Meine Frage ist welche option soll ich wählen? Was sind die Vorteile und Nachteile jeder option. (die einfache Bereitstellung, Konfiguration Durcheinander)
Ist diese implementiert werden können, mithilfe von JBoss Cache oder ehcache oder beides.
Update:
Ich bin mit hibernate, aber die Ergebnisse sind keine Entitäten, Sie sind Leistungsindikatoren. Ich brauche, um alle Zeilen zu zählen, die gehören bestimmten Kategorie und haben einen bestimmten status. Ich möchte, dass das Ergebnis zwischengespeichert werden.
Sollte ich wickeln Sie die Ergebnisse innerhalb einer Person? Dann, wie kann ich es machen das arbeiten wie (materialisierten?) anzeigen in oracle - werden Updates automatisch oder durch trigger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du gehst zu haben, um die Daten aus der
ResultSet
und in Objekte um zum cache ist es also, warum nicht starten Sie einfach mit Hibernate bietet Zwischenspeicherung unter Verwendung einer Vielfalt von Optionen inclucing Ehcache, JBoss Cache und eine einfache Karte.http://docs.jboss.org/hibernate/core/4.1/manual/en-US/html/ch20.html#performance-cache
Für die Gründung einer WeakHashMap kann wohl tun, was Sie brauchen für jetzt.
Erstellen Sie zwei Klassen, eine Taste halten der Werte benötigt, um den Schlüssel zu identifizieren (Sie erinnern sich zum implementieren von equals() und hashcode()), und einen Wert an die holding der retreived Werte wie herausgezogen aus dem ResultSet. Das einfachste ist wahrscheinlich eine Liste der Karten (eine Karte pro Zeile).
Java wird automatisch zum erlöschen der Einträge, wenn der Speicher in einer WeakHashMap.
Wenn Sie wollen einfach nur eine schnelle Rolle-Ihre eigenen caching-Lösung haben Sie einen Blick auf diese Artikel auf JavaSpecialist, das ist eine rezension des Buches Java Concurrency in Practice von Brian Goetz.
Er spricht über die Implementierung eines basic-thread-safe-cache mit einem FutureTask und ein ConcurrentHashMap.
Die Art und Weise dies getan wird sichergestellt, dass nur eine gleichzeitige thread löst den lange Laufenden Berechnungen (in Ihrem Fall, Ihre SQL-Aufruf). Ohne etwas wie das zu tun, dann sind Sie in Gefahr, mehrere threads auslösen der SQL-Aufruf, wenn Sie Ihren cache leeren, z.B. wenn Sie bei starker Belastung sofort, nachdem Sie begonnen haben, Ihre app-server. Natürlich, seine bis zu Ihnen zu beurteilen, ob das ein problem für Sie, oder wenn Sie gerne eine einfachere Lösung, wo der Letzte thread zu vervollständigen, stellt sein Ergebnis in den cache.
Würden Sie ändern müssen, um diese Lösung zum hinzufügen von cache-Ablauf, wenn Sie es brauchen. Auch, es würde nicht den Speicher freizugeben, wie Thorbjørn Vorschlag der Verwendung einer WeakHashMap.
Gibt es keinen Punkt in der Entwicklung ein Rad von Grund auf neu. Ich bin mit Google Guava Cache in großen Java-EE-Anwendung und würde definitiv empfehlen es. Lesen Sie mehr von:
https://code.google.com/p/guava-libraries/
und direkt zum Cache:
http://guava-libraries.googlecode.com/files/JavaCachingwithGuava.pdf