In diesem Artikel wird hauptsächlich der Hibernate-Second-Level-Cache in Java ausführlich erläutert. Jetzt werde ich ihn mit Ihnen teilen und ihn als Referenz verwenden. Folgen wir dem Editor, um einen Blick darauf zu werfen
Hibernate-Cache der zweiten Ebene
1. Ein im Computerbereich sehr verbreitetes Konzept. Es befindet sich zwischen der Anwendung und der permanenten Datenspeicherquelle (z. B. einer Datei oder Datenbank auf der Festplatte). Seine Funktion besteht darin, die Häufigkeit zu verringern, mit der die Anwendung direkt die permanente Datenspeicherquelle liest und schreibt, und so die Ausführung der Anwendung zu verbessern Leistung. Die Daten im Cache sind eine Kopie der Daten in der Datenspeicherquelle. Das physische Medium des Caches ist normalerweise der Speicher
Der Ruhezustand bietet zwei Cache-Ebenen
Die erste Cache-Ebene ist Sitzung
Level-Cache, bei dem es sich um einen transaktionsbezogenen Cache handelt. Diese Cache-Ebene wird vom Ruhezustand verwaltet und erfordert im Allgemeinen keinen Eingriff
Der Cache von Hibernate kann in zwei Kategorien unterteilt werden:
Eingebauter Cache: Hibernate wird mitgeliefert und kann nicht deinstalliert werden. Normalerweise speichert Hibernate die Zuordnung Metadaten und vordefinierte SQL-Anweisungen werden im Cache von SessionFactory abgelegt. Die Mapping-Metadaten sind eine Kopie der Daten in der Mapping-Datei, und die vordefinierten SQL-Anweisungen werden von Hibernate basierend auf den Mapping-Metadaten ausgelesen -nur.
2. Verstehen Sie die gleichzeitige Zugriffsstrategie des Second-Level-Cache
3. Konfigurieren Sie den prozessweiten Second-Level-Cache (Ehcache-Cache konfigurieren)
1 Kopieren Sie ehcache-1.5. 0.jar in das lib-Verzeichnis des aktuellen Projekts
Abhängig von backport-util-concurrent
und commons-logging
2 Einschalten der Second-Level-Cache
<property name="hibernate.cache.use_second_level_cache">true</property>4 Geben Sie die Klasse an, die den Second-Level-Cache verwendet
<property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</property>Methode eins ist: Verwenden Sie die *.hbm.xml-Konfiguration der Klasse
-Attribut des
Objekts
zwischenspeichert, die festgelegten Attribute jedoch nicht zwischengespeichert werden Für die Set-Attribute müssen Sie das Unterelement zum Element a8abddae2bfa76e67e6a5b60161e3886 hinzufügen. Konfigurieren Sie es in der Datei hibernate.cfg.xml )
5 Konfigurieren Sie die standardmäßigeKonfigurationsdatei von ehcache
ehcache.xml (fester Name) (legen Sie es in den Klassenpfad)<!-- 指定使用二级缓存的类 放在maping下面 --> <!-- 配置类级别的二级缓存 --> <class-cache class="com.sihai.c3p0.Customer" usage="read-write"/> <class-cache class="com.sihai.c3p0.Order" usage="read-write"/> <!-- 配置集合级别的二级缓存 --> <collection-cache collection="com.sihai.c3p0.Customer.orders" usage="read-write"/>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="c:/ehcache"/> <defaultCache maxElementsInMemory="5" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
[Verwandte Empfehlungen]
1.package com.sihai.hibernate3.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.sihai.hibernate3.demo1.Customer; import com.sihai.hibernate3.demo1.Order; import com.sihai.utils.HibernateUtils; public class HibernateTest6 { @Test // 查询缓存的测试 public void demo9(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("select c.cname from Customer c"); // 使用查询缓存: query.setCacheable(true); query.list(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); query = session.createQuery("select c.cname from Customer c"); query.setCacheable(true); query.list(); tx.commit(); } @SuppressWarnings("unused") @Test // 更新时间戳 public void demo8(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 2); session.createQuery("update Customer set cname = '奶茶' where cid = 2").executeUpdate(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 2); tx.commit(); } @SuppressWarnings("all") @Test // 将内存中的数据写到硬盘 public void demo7(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); List<Order> list = session.createQuery("from Order").list(); tx.commit(); } @Test // 一级缓存的更新会同步到二级缓存: public void demo6(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); customer.setCname("芙蓉"); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); tx.commit(); } @SuppressWarnings("unchecked") @Test // iterate()方法可以查询所有信息. // iterate方法会发送N+1条SQL查询.但是会使用二级缓存的数据 public void demo5(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // N+1条SQL去查询. Iterator<Customer> iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); } @SuppressWarnings("unchecked") @Test // 查询所有.Query接口的list()方法. // list()方法会向二级缓存中放数据,但是不会使用二级缓存中的数据. public void demo4(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 查询所有客户: // list方法会向二级缓存中放入数据的. List<Customer> list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); // Customer customer = (Customer) session.get(Customer.class, 1);// 没有发生SQL ,从二级缓存获取的数据. // list()方法没有使用二级缓存的数据. list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); } @Test // 二级缓存的集合缓冲区特点: public void demo3(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer.getOrders().size()); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer2.getOrders().size()); tx.commit(); } @SuppressWarnings("unused") @Test // 配置二级缓存的情况 public void demo2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer1 == customer2); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 不发送SQL. Customer customer4 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer3 == customer4); tx.commit(); } @SuppressWarnings("unused") @Test // 没有配置二级缓存的情况 public void demo1(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 发送SQL. tx.commit(); } }
Besondere Empfehlung
: „php Programmer Toolbox“ V0 .1 Version herunterladen 2. Java Kostenloses Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Second-Level-Cache in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!