Dieser Artikel beschreibt die Caching -Technologie im Hibernate -Framework. Teilen Sie es für Ihre Referenz wie folgt weiter:
Der Cache des Hibernate -Frameworks ist in Sitzungs -Cache und SessionFactory -Cache unterteilt, das auch als Cache -1 -Cache und Level 2 -Cache bezeichnet wird.
Stufe 1 Cache:
Level-1-Cache ist ein Cache auf Sitzungsebene, der einen kurzen Lebenszyklus hat, der Sitzung entspricht, wird von Hibernate verwaltet und ist ein transaktionsweiter Cache. Wenn das Programm die Sitzung der Sitzungslast () -Methode aufruft, methode save (), saveorUpdate () Methode, update () -Methode oder Abfrage -Schnittstellenmethode, kann der Hibernate das Entitätsobjekt zwischenspeichert. Wenn das Entitätsobjekt über die methode load () oder die methode () abfragt wird, wird Hibernate zunächst in den Cache abfragen. Nur wenn das Entitätsobjekt nicht gefunden werden kann, gibt Hibernate SQL -Anweisungen zur Abfrage in der Datenbank aus, wodurch die Effizienz der Verwendung von Hibernate verbessert wird.
Zum Beispiel:
Paket com.xqh.util; import org.hibernate.Session; import com.xqh.model.user; public class test {public static void main (String [] args) {session = null; try {session = hibernatutil.getSession (); // SESSIsionSsion.BeginTransaction () erhalten; // Transaktionssystem aktivieren.out.println ("Erste Abfrage:"); User user = (user) session.get (user.class, New Integer (1)); System.out.println ("Benutzername:" + user.getName (); System.out.println ("Second Query:"); User User1 = (User) Session.get (user.classe, 1); user1.getName ()); session.getTransaction (). commesent ();} catch (exception e) {e.printstacktrace (); // Ein Fehler rollt die Transaktionssitzung zurück.Wenn das Programm das Benutzerobjekt zum ersten Mal über die Get () -Methode überprüft, gibt Hibernate eine SQL -Anweisung an die Abfrage aus. Zu diesem Zeitpunkt führt Hibernate einen Cache in der ersten Ebene in seinem Benutzerobjekt durch. Wenn der Hibernate erneut die Get () -Methode durchfragt, gibt es keine SQL-Anweisung aus, da der Benutzername bereits im Cache der ersten Ebene vorhanden ist. Programmauslaufergebnisse:
Erste Abfrage: Hibernate: selectUser0_.id as id0_0_, user0_.name als name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ withuser0_.id =?
Hinweis: Der Lebenszyklus des Cache der ersten Ebene entspricht der Sitzung und wird nicht zwischen den Sitzungen geteilt. In verschiedenen Sitzungen können die in anderen Sitzungen zwischengespeicherten Entitätsobjekten nicht erhalten werden.
Stufe 2 Cache:
Der Cache der zweiten Ebene ist ein Cache auf SessionFactory-Ebene, und sein Lebenszyklus steht im Einklang mit dem SessionFactory. Der sekundäre Cache kann zwischen mehreren Sitzungen geteilt werden und ist ein prozessweiter oder clusterweiter Cache.
Level 2 Cache ist ein Plugbable-Cache-Plug-In, und die Verwendung erfordert die Unterstützung von Cache-Produkten von Drittanbietern. Im Hibernate -Framework wird die Nutzungsrichtlinie des Sekundärcache über die Hibernate -Konfigurationsdatei konfiguriert.
1. Fügen Sie Cache -Konfigurationsdatei EHCache.xml hinzu
<Ehcache> <! - Legt den Pfad zum Verzeichnis fest, in dem Cache -Data -Dateien erstellt werden. Wenn der Pfad eine Java -Systemeigenschaft ist, wird es in dem laufenden VM.Die die folgenden Eigenschaften übersetzt: User path = "java.io.tmpdir"/> <!-Standard-Cache-Konfiguration. Diese werden auf Caches angewendet, die durch den CacheManager programmiert erstellt wurden. Die folgenden Attribute sind für StandardCache: MaxinMemory erforderlich - legt die maximale Anzahl von Objekten fest, die in Speicher- und Speicher- und Leistungsfähigkeit erstellt werden. Legt fest, ob Elemente ewig sind. Wenn ewig, werden die Zeitüberschreitungen ignoriert und das Elementis ist nie abgelaufen. Ist nur gebraucht, wenn das Element nicht ewig ist. Die Leerlaufzeit ist jetzt - zuletzt auf TimetimetoliveSeconds zugegriffen - legt die Zeit fest, ein Element zu leben, bevor es abläuft. Ist nur gebraucht, wenn das Element nicht ewig ist. TTL ist jetzt-Erstellen von Zeitoverflowtodisk-Legt fest, ob Elemente über die Festplatte überlaufen können, wenn das In-Memory-Cachehas die MaxinMemory-Grenze erreicht hat .--> <defaultCachemaxelementssinmemory = "10000" eternal = "False" TimetoidleSeconds = "120". Caches. Fügen Sie hier Ihre Cache -Konfigurationseinstellungen hinzu. Wenn Sie keine Konfiguration für Ihren Cache haben, wird eine Warnung ausgegeben, wenn der Kocherager startet. Die folgenden Attribute sind für defaultCache: Name erforderlich - Legt den Namen des Cache fest. Dies wird verwendet, um den Cache zu identifizieren. Es muss eindeutig sein. Wenn ewig, werden die Zeitüberschreitungen ignoriert und das Elementis ist nie abgelaufen. Ist nur gebraucht, wenn das Element nicht ewig ist. Die Leerlaufzeit ist jetzt - zuletzt auf TimetimetoliveSeconds zugegriffen - legt die Zeit fest, ein Element zu leben, bevor es abläuft. Ist nur gebraucht, wenn das Element nicht ewig ist. TTL ist jetzt-Erstellen von Zeitoverflowtodisk-Legt fest, ob Elemente über die Scheibe überlaufen können, wenn der In-Memory-Cachehas die MaxinMemory-Grenze erreicht hat .--> <! Thedisk -Cache, der in dieser Konfiguration überall überall hinweg auf Ihrem System definiert ist. Auf einem Standard-Linux-System ist dies /tmp "-> <cache name =" samplecache1 "MaxelementSinMemory =" 10000 "eternal =" Falsch "TimetoidleSeconds =" 300 "TimetoliveSeconds =" 600 ". Nicht abgelaufen.
2. Stellen Sie die Hibernate -Konfigurationsdatei ein.
<!-Level 2 Cache aktivieren-> <Eigenschaft name = "hibernate.cache.use_second_level_cache"> true </property> <!-Cache-Produktanbieter-> <Eigenschaft name = "hibernate.cache.provider_class"> org.hibernate.Ehcaches 2/achht. Cache ---> <class-cache useage = "schreibgeschützt"> </class-cache>
Beispiel:
Paket com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (string [] args) {session sis sis = null; // Erste Sessiontry {session = hibernateUtil.getSession (); Sitzung.BeginTransaction (); System.out.println ("Erste Abfrage:"); User User = (Benutzer) Sitzung.get (user.class, 1); System.out.Out.println ("Benutzername:" + user.getn (). {e.printstacktrace (); // Ein Fehler rollt die Transaktionssitzung zurück. // Aktivieren Sie die zweite Cache -Session. Transaction Session.getTransaction (). Rollback ();} schließlich {// Schließen Sie das Sitzungsobjekt hibernateUtil.closeSession (Sitzung);}}}Der sekundäre Cache wird zwischen den Sitzungen geteilt, sodass das gleiche Objekt in verschiedenen Sitzungen geladen werden kann. Hibernate wird nur eine SQL -Anweisung ausgeben. Wenn das Objekt beim zweiten Mal geladen wird, erhält Hibernate dieses Objekt aus dem Cache.
Programmergebnisse:
Erste Abfrage: Hibernate: selectUser0_.id as id0_0_, user0_.name als name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ withuser0_.id =?
Für L2 -Cache können einige selten aktualisierte Daten oder referenzierte Daten verwendet werden, und seine Leistung wird zu diesem Zeitpunkt erheblich verbessert. Wenn jedoch die häufig geänderten Daten für L2 -Cache verwendet werden, verursacht die Leistung bestimmte Probleme.
Ich hoffe, dass die Beschreibung in diesem Artikel für Java -Programme aller hilfreich ist, die auf dem Hibernate -Framework basieren.