0

Caching in Apache OFBiz

Geschrieben am 29.10.2012 in Technik von Sebastian Leitner

Der integrierte Cache-Mechanismus ist eine zentrale Komponente für die gute Performance des OFBiz-Frameworks. Dieser Artikel zeigt auf, wann der Einsatz des Caches sinnvoll ist und wann nicht. Anschließend wird ein wenig Klarheit in die technische Funktionsweise gebracht.

Technisch gesehen werden alle Anfragen in Richtung Datenbank über den Delegator abgewickelt, dies ist wenn man so möchte eine eigene Persistenzschicht. Das Ergebnis kann als Objekt im Cache im Arbeitsspeicher abgelegt werden und so deutlich schneller wiederverwendet werden. Das ist insbesondere sinnvoll für Objekte, die besonders häufig gelesen werden. In E-Commerce Anwendungen kann dies z. B. die Kategorie-Struktur sein, die dem Besucher im Frontend angezeigt wird oder die Top-Produkte auf der Startseite.
Werden Objekte häufig verändert oder nur ein einziges Mal gelesen, dann macht es wenig Sinn sie zu cachen, die bei jeder Änderung der Cache geprüft und das entsprechende Element entfernt/invalidiert werden muss. Hier kann unter Umständen ein gewaltiger Overhead entstehen, der die Performance des gesamten Systems eher verschlechtert. Besonders bei Jobs, die große Datenmengen verarbeiten, z. B. Im-/Exports, sollte der Cache nicht verwendet werden. Auch um bspw. zu verhindern, dass Objekte im Cache landen, die dort nicht benötigt werden und die den Cache dann unnötig aufblähen oder wichtigere Objekte verdrängen.
Soll ein Objekt aus der Datenbank gelesen, verändert und wieder gespeichert werden, darf es nicht aus dem Cache stammen.

Der Cache von OFBiz kann also der Performance und damit auch der Skalierbarkeit des Systems enorm helfen, aber auch schaden. Als nächsten wollen wir die technischen Bestandteile des Caches vorstellen.

Der Cache wird direkt im Delegator initialisiert, es existiert also ein Cache pro Delegator. Das Cache-Objekt besteht aus drei einzelnen Caches: einem EntityCache, EntityObjectCache und einem EntityListCache. Diese sollen im Folgenden näher beleuchtet werden.

EntityCache

Abgeleitet von AbstractCache ist der EntityCache der Basis-Cache für alle GenericValue Objekte. Ein in den Cache geschriebenes GenericValue Objekt ist immer als immutable markiert. Damit kann das Objekt im Cache nicht mehr geändert werden sondern muss im Falle einer Aktualisierung überschrieben werden.
–> Wird z.B. in der findOne Methode verwendet.

EntityObjectCache

Abgeleitet von AbstractEntityConditionCache ist er ein Cache für allgemeine Objekte. Objekte werden anhand einer Bedingung (Condition) im ObjectCache abgelegt und können dementsprechend auch gelesen bzw. gelöscht werden.
–> Wird intern für die Rechte Verwaltung verwendet

EntityListCache

Der EntityListCache, abgeleitet von AbstractEntityConditionCache, ist ebenfalls ein ConditionCache speziell für Listen von GenericValues, die anhand einer orderBy Liste sortiert sein können. Die Bedingung dient auch hier, wie beim Objekt Cache, zum identifizieren des Caches, wobei die orderBy Liste als Schlüssel innerhalb des Caches genutzt wird. Somit können komplette Result Sets aus einer Datenbank Abfrage gecached werden.
–> Wird in der findList Methode verwendet

Die Condition Caches bieten eine storeHook Methode. Diese wird aufgerufen, sobald ein neues Entity Objekt in den Cache geschrieben wird und in der Entity Definition das Feld auto-clear-cache auf true gesetzt ist (default). storeHook entfernt anhand der mit der Entity verbundenen Bedingungen alle Einträge aus dem Cache. So wird sichergestellt, dass keine Datensätze mit einem alten Datenstand während eines Updates im Cache bleiben.

UtilCache

Die Cache Util Klasse bietet generalisierte Hilfsmethoden für die Cache Verwaltung. Unter anderem können Limits für die Größe des Caches gesetzt werden, was dazu führt, dass beim Hinzufügen eines Elements, dass Element welches am wenigsten genutzt wurde entfernt wird. Die Hilfsklasse bietet die Möglichkeit Objekte, die in den Cache geladen werden, zu verfolgen und sobald das Ablaufdatum erreicht ist zu melden. Auch werden fehlerhafte und erfolgreiche Zugriffe gezählt. Hier wird außerdem die Tabelle aller initialisierten Caches verwaltet.

In den Webtools lässt sich der Cache im Bereich Cache Maintanance verwalten. Hier kann jedes einzelnen Cache Element betrachtet, editiert oder gelöscht werden. Natürlich lässt sich auch der komplette Cache leeren. Auch lassen sich Informationen über den Speicherverbrauch, Größe, Hits und das Ablaufdatum ablesen.

Dieser Artikel gefällt Ihnen? Sagen Sie's Ihren Freunden:

Hinterlassen Sie eine Antwort





*