>  기사  >  Java  >  Java의 2차 캐시에 대한 자세한 설명

Java의 2차 캐시에 대한 자세한 설명

Y2J
Y2J원래의
2017-05-16 09:59:083634검색

이 글은 주로 Java의 hibernate 2차 캐시에 대한 자세한 설명을 소개하고 있는데, 편집자는 꽤 좋다고 생각합니다. 이제 참고용으로 공유하겠습니다. 편집기를 따라 살펴보겠습니다

Hibernate의 2차 캐시

1. 캐시 개요

캐시 ): 컴퓨터 분야에서 매우 일반적인 개념입니다. 이는 애플리케이션과 영구 데이터 저장 소스(예: 하드 디스크의 파일 또는 데이터베이스) 사이에 위치하며, 해당 기능은 애플리케이션이 영구 데이터 저장 소스를 직접 읽고 쓰는 빈도를 줄여 애플리케이션의 실행을 향상시키는 것입니다. 성능. 캐시의 데이터는 데이터 저장소 원본에 있는 데이터의 복사본입니다. 캐시의 물리적 매체는 일반적으로 메모리입니다.

hibernate는 두 가지 수준의 캐시를 제공합니다.

캐시의 첫 번째 수준은 세션 레벨 캐시(트랜잭션 범위 캐시) 이 캐시 수준은 최대 절전 모드로 관리되며 일반적으로 개입이 필요하지 않습니다

두 번째 캐시 수준은 프로세스 전체 캐시인 SessionFactory 수준 캐시입니다


Hibernate의 캐시는 두 가지 범주로 나눌 수 있습니다:

내장 캐시: Hibernate는 함께 제공되며 제거할 수 없습니다. 일반적으로 Hibernate의 초기화 단계 동안 Hibernate는 매핑을 저장합니다. 메타데이터와 미리 정의된 SQL 문은 SessionFactory의 캐시에 배치됩니다. 매핑 메타데이터는 매핑 파일에 있는 데이터의 복사본이며, 미리 정의된 SQL 문은 매핑 메타데이터를 기반으로 Hibernate에 의해 푸시됩니다. -only.


외부 캐시(두 번째 수준 캐시): 구성 가능한 캐시 플러그인. 기본적으로 SessionFactory는 이 캐시 플러그인을 활성화하지 않습니다. 데이터베이스 데이터, 외부 캐시의 물리적 매체는 메모리 또는 하드 디스크일 수 있습니다

2. 2차 캐시의 동시 액세스 전략 이해

3. 프로세스 전체의 2차 캐시 구성(ehcache 캐시 구성)

1 ehcache-1.5를 복사합니다. 0.jar을 현재 프로젝트의 lib 디렉토리에 복사


backport-util-con

current 및 commons-logging

에 따라 2 켜기 두 번째 수준 캐시

<property name="hibernate.cache.use_second_level_cache">true</property>

3 캐시 공급자를 지정하려면

 <property name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider</property>

4 두 번째 수준 캐시를 사용하는 클래스 지정


방법 1: *를 사용합니다. 클래스의 hbm.xml 구성


사용해야 할 항목 선택 두 번째 수준 캐시의 지속성 클래스는 두 번째 수준 캐시의 동시 액세스 정책을 설정합니다. 06fc722e8309f4fc3af5f9b05c0cd286 요소는 Hibernate가

객체의 간단한 속성을 캐시하지만 컬렉션 속성은 캐시되지 않음을 나타냅니다. 4e182acc01ad0c6024ad937baa9dc60b 요소에 62aecd17e676a41d3547c3bf97bb07b0 하위 요소

를 추가해야 합니다. xml 파일의 구성(권장 사항)

  <!-- 指定使用二级缓存的类 放在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"/>

5 ehcache의 기본

구성 파일 구성 ehcache.xml(고정 이름)(클래스 경로에 위치)

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

4. 테스트

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 = &#39;奶茶&#39; 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(); 
 } 
}

[관련 추천]

1.

특별 추천: "php 프로그래머 툴박스 ”V0.1 버전 다운로드

2.

Java 무료 동영상 튜토리얼

3.

JAVA 튜토리얼 매뉴얼

위 내용은 Java의 2차 캐시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.