Ruhezustand - Caching
Caching ist ein Mechanismus zur Verbesserung der Leistung eines Systems. Es ist ein Pufferspeicher, der zwischen der Anwendung und der Datenbank liegt. Der Cache-Speicher speichert kürzlich verwendete Datenelemente, um die Anzahl der Datenbanktreffer so weit wie möglich zu reduzieren.
Das Zwischenspeichern ist auch für den Ruhezustand wichtig. Es verwendet ein mehrstufiges Caching-Schema, wie unten erläutert -
Cache der ersten Ebene
Der Cache der ersten Ebene ist der Sitzungscache und ein obligatorischer Cache, durch den alle Anforderungen geleitet werden müssen. Das Session-Objekt behält ein Objekt aus eigener Kraft, bevor es in die Datenbank übernommen wird.
Wenn Sie mehrere Aktualisierungen für ein Objekt ausgeben, versucht Hibernate, die Aktualisierung so lange wie möglich zu verzögern, um die Anzahl der ausgegebenen SQL-Aktualisierungsanweisungen zu verringern. Wenn Sie die Sitzung schließen, gehen alle zwischengespeicherten Objekte verloren und werden entweder beibehalten oder in der Datenbank aktualisiert.
Cache der zweiten Ebene
Der Cache der zweiten Ebene ist ein optionaler Cache, und der Cache der ersten Ebene wird immer konsultiert, bevor versucht wird, ein Objekt im Cache der zweiten Ebene zu lokalisieren. Der Cache der zweiten Ebene kann pro Klasse und Sammlung konfiguriert werden und ist hauptsächlich für das Zwischenspeichern von Objekten über Sitzungen hinweg verantwortlich.
Jeder Cache eines Drittanbieters kann mit Hibernate verwendet werden. Einorg.hibernate.cache.CacheProvider Es wird eine Schnittstelle bereitgestellt, die implementiert werden muss, um Hibernate ein Handle für die Cache-Implementierung bereitzustellen.
Cache auf Abfrageebene
Hibernate implementiert auch einen Cache für Abfrageergebnismengen, der eng in den Cache der zweiten Ebene integriert ist.
Dies ist eine optionale Funktion und erfordert zwei zusätzliche physische Cache-Bereiche, die die zwischengespeicherten Abfrageergebnisse und die Zeitstempel enthalten, als eine Tabelle zuletzt aktualisiert wurde. Dies ist nur für Abfragen nützlich, die häufig mit denselben Parametern ausgeführt werden.
Der Cache der zweiten Ebene
Der Ruhezustand verwendet standardmäßig den Cache der ersten Ebene, und Sie haben nichts zu tun, um den Cache der ersten Ebene zu verwenden. Gehen wir direkt zum optionalen Cache der zweiten Ebene. Nicht alle Klassen profitieren vom Caching, daher ist es wichtig, den Cache der zweiten Ebene deaktivieren zu können.
Der Cache der zweiten Ebene im Ruhezustand wird in zwei Schritten eingerichtet. Zunächst müssen Sie entscheiden, welche Parallelitätsstrategie verwendet werden soll. Danach konfigurieren Sie den Cache-Ablauf und die physischen Cache-Attribute mithilfe des Cache-Anbieters.
Parallelitätsstrategien
Eine Parallelitätsstrategie ist ein Mediator, der dafür verantwortlich ist, Datenelemente im Cache zu speichern und aus dem Cache abzurufen. Wenn Sie einen Cache der zweiten Ebene aktivieren möchten, müssen Sie für jede persistente Klasse und Sammlung festlegen, welche Cache-Parallelitätsstrategie verwendet werden soll.
Transactional - Verwenden Sie diese Strategie für meistlesbare Daten, bei denen es im seltenen Fall eines Updates wichtig ist, veraltete Daten bei gleichzeitigen Transaktionen zu vermeiden.
Read-write - Verwenden Sie diese Strategie erneut für meistgelesene Daten, bei denen es im seltenen Fall einer Aktualisierung wichtig ist, veraltete Daten bei gleichzeitigen Transaktionen zu vermeiden.
Nonstrict-read-write- Diese Strategie übernimmt keine Garantie für die Konsistenz zwischen Cache und Datenbank. Verwenden Sie diese Strategie, wenn sich Daten kaum ändern und eine geringe Wahrscheinlichkeit veralteter Daten nicht von entscheidender Bedeutung ist.
Read-only- Eine für Daten geeignete Parallelitätsstrategie, die sich nie ändert. Verwenden Sie es nur als Referenzdaten.
Wenn wir das Caching der zweiten Ebene für unsere verwenden wollen Employee Klasse, fügen wir das Zuordnungselement hinzu, das erforderlich ist, um Hibernate anzuweisen, Mitarbeiterinstanzen mithilfe der Lese- / Schreibstrategie zwischenzuspeichern.
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<cache usage = "read-write"/>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
Das Attribut usage = "read-write" weist Hibernate an, eine Lese- / Schreib-Parallelitätsstrategie für den definierten Cache zu verwenden.
Cache-Anbieter
In Ihrem nächsten Schritt, nachdem Sie die Parallelitätsstrategien berücksichtigt haben, verwenden Sie Ihre Cache-Kandidatenklassen, um einen Cache-Anbieter auszuwählen. Im Ruhezustand müssen Sie einen einzelnen Cache-Anbieter für die gesamte Anwendung auswählen.
Sr.Nr. | Cache Name & Beschreibung |
---|---|
1 | EHCache Es kann im Speicher oder auf der Festplatte und im Cluster zwischengespeichert werden und unterstützt den optionalen Ergebnis-Cache für den Ruhezustand. |
2 | OSCache Unterstützt das Caching auf Speicher und Festplatte in einer einzelnen JVM mit einer Vielzahl von Ablaufrichtlinien und Unterstützung für den Abfrage-Cache. |
3 | warmCache Ein auf JGroups basierender Cluster-Cache. Es verwendet die Clustered Invalidierung, unterstützt jedoch nicht den Hibernate-Abfragecache. |
4 | JBoss Cache Ein vollständig transaktionsreplizierter Cluster-Cache, der ebenfalls auf der JGroups-Multicast-Bibliothek basiert. Es unterstützt Replikation oder Invalidierung, synchrone oder asynchrone Kommunikation sowie optimistisches und pessimistisches Sperren. Der Hibernate-Abfragecache wird unterstützt. |
Jeder Cache-Anbieter ist nicht mit jeder Parallelitätsstrategie kompatibel. Die folgende Kompatibilitätsmatrix hilft Ihnen bei der Auswahl einer geeigneten Kombination.
Strategie / Anbieter | Schreibgeschützt | Nonstrictread-write | Lesen Schreiben | Transaktion |
---|---|---|---|---|
EHCache | X. | X. | X. | |
OSCache | X. | X. | X. | |
SwarmCache | X. | X. | ||
JBoss Cache | X. | X. |
Sie geben einen Cache-Anbieter in der Konfigurationsdatei hibernate.cfg.xml an. Wir wählen EHCache als unseren Cache-Anbieter der zweiten Ebene -
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- Assume students is the database name -->
<property name = "hibernate.connection.url">
jdbc:mysql://localhost/test
</property>
<property name = "hibernate.connection.username">
root
</property>
<property name = "hibernate.connection.password">
root123
</property>
<property name = "hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- List of XML mapping files -->
<mapping resource = "Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Jetzt müssen Sie die Eigenschaften der Cache-Regionen angeben. EHCache hat eine eigene Konfigurationsdatei,ehcache.xml, die im KLASSENPFAD der Anwendung stehen sollte. Eine Cache-Konfiguration in ehcache.xml für die Employee-Klasse könnte folgendermaßen aussehen:
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory = "1000"
eternal = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
overflowToDisk = "true"
/>
<cache name = "Employee"
maxElementsInMemory = "500"
eternal = "true"
timeToIdleSeconds = "0"
timeToLiveSeconds = "0"
overflowToDisk = "false"
/>
Das war's, jetzt haben wir das Caching der zweiten Ebene für die Employee-Klasse aktiviert und Hibernate trifft jetzt den Cache der zweiten Ebene, wenn Sie zu einem Employee navigieren oder wenn Sie einen Employee anhand einer Kennung laden.
Sie sollten alle Klassen analysieren und für jede Klasse eine geeignete Caching-Strategie auswählen. Manchmal kann das Caching der zweiten Ebene die Leistung der Anwendung beeinträchtigen. Es wird daher empfohlen, zuerst Ihre Anwendung zu bewerten, ohne das Caching zu aktivieren, und später das gut geeignete Caching zu aktivieren und die Leistung zu überprüfen. Wenn das Caching die Systemleistung nicht verbessert, macht es keinen Sinn, irgendeine Art von Caching zu aktivieren.
Der Cache auf Abfrageebene
Um den Abfragecache zu verwenden, müssen Sie ihn zuerst mit dem aktivieren hibernate.cache.use_query_cache="true"Eigenschaft in der Konfigurationsdatei. Wenn Sie diese Eigenschaft auf true setzen, erstellen Sie im Ruhezustand die erforderlichen Caches im Speicher, um die Abfrage- und Bezeichnersätze aufzunehmen.
Um den Abfragecache zu verwenden, verwenden Sie als Nächstes die setCacheable (Boolean) -Methode der Query-Klasse. Zum Beispiel -
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();
Der Ruhezustand unterstützt auch eine sehr fein abgestimmte Cache-Unterstützung durch das Konzept einer Cache-Region. Eine Cache-Region ist Teil des Caches, dem ein Name zugewiesen wurde.
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();
Dieser Code verwendet die Methode, um Hibernate anzuweisen, die Abfrage im Mitarbeiterbereich des Caches zu speichern und zu suchen.