Sonntag, April 5, 2020

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:

  1. Verwenden eine caching-manager und manuell setzen die Ergebnisse in den cache.

  2. 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.

InformationsquelleAutor m_vitaly | 2009-06-23

4 Kommentare

  1. 3

    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

    • Während ich Stimme mit den oben genannten, die Umwandlung einer bestehenden app, um Winterschlaf zu halten kann ein Schmerz sein, und sollte nicht als eine leichte Aufgabe.
    • Ich bin mit hibernate und die Abfragen sind zum Beispiel zählen Sie alle Zeilen mit bestimmten Kategorie, status, etc. Ich möchte die cache-der counter.
    • Mit mehr wissen über das problem, ich würde geneigt sein, zu behandeln die Schalter als domain-Objekte laden und via Hibernate. Sie haben 2 Möglichkeiten, das zu tun – entweder definieren Sie benutzerdefinierte SQL liefert ein ResultSet mit den Grafen und den status bei oder erstellen Sie eine Ansicht, die nicht die gleiche Sache. Ich würde geneigt sein, eine Ansicht, aber wie sage ich ohne Kenntnis der genauen details, es ist schwer zu sagen. Sie haben auch Umgang mit cache-Synchronisation, aber das problem wird bestehen, welche Lösung auch immer Sie wählen.
    • Haben Sie eine examplefor dies mit native SQL? Oder nur mit custom HQL, fast wie ein Stadtplan.
    • Werfen Sie einen Blick auf docs.jboss.org/hibernate/stable/core/reference/en/html/… – sollte erklären, was Sie tun müssen.
  2. 3

    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.

  3. 2

    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.

Kostenlose Online-Tests