최대 절전 모드-캐싱

캐싱은 시스템의 성능을 향상시키는 메커니즘입니다. 애플리케이션과 데이터베이스 사이에있는 버퍼 메모리입니다. 캐시 메모리는 데이터베이스 적중 횟수를 최대한 줄이기 위해 최근에 사용한 데이터 항목을 저장합니다.

캐싱은 Hibernate에서도 중요합니다. 아래에 설명 된 것처럼 다중 레벨 캐싱 체계를 사용합니다.

첫 번째 수준 캐시

첫 번째 수준 캐시는 세션 캐시이며 모든 요청이 통과해야하는 필수 캐시입니다. Session 개체는 개체를 데이터베이스에 커밋하기 전에 자체 권한으로 유지합니다.

객체에 여러 업데이트를 발행하는 경우 Hibernate는 발행 된 업데이트 SQL 문 수를 줄이기 위해 가능한 한 업데이트 수행을 지연 시키려고합니다. 세션을 닫으면 캐시중인 모든 개체가 손실되고 데이터베이스에서 유지되거나 업데이트됩니다.

2 단계 캐시

두 번째 수준 캐시는 선택적 캐시이며 두 번째 수준 캐시에서 개체를 찾으려고 시도하기 전에 항상 첫 번째 수준 캐시를 참조합니다. 두 번째 수준 캐시는 클래스 및 컬렉션 단위로 구성 할 수 있으며 주로 세션 전체에서 개체를 캐싱합니다.

모든 타사 캐시는 Hibernate와 함께 사용할 수 있습니다. 안org.hibernate.cache.CacheProvider 인터페이스가 제공되며, 이는 캐시 구현에 대한 핸들을 Hibernate에 제공하기 위해 구현되어야합니다.

쿼리 수준 캐시

Hibernate는 또한 두 번째 수준 캐시와 밀접하게 통합되는 쿼리 결과 집합에 대한 캐시를 구현합니다.

이는 선택적 기능이며 캐시 된 쿼리 결과와 테이블이 마지막으로 업데이트 된 타임 스탬프를 보관하는 두 개의 추가 물리적 캐시 영역이 필요합니다. 이는 동일한 매개 변수로 자주 실행되는 쿼리에만 유용합니다.

두 번째 레벨 캐시

Hibernate는 기본적으로 1 단계 캐시를 사용하며 1 단계 캐시를 사용하기 위해 할 일이 없습니다. 선택 사항 인 2 단계 캐시로 바로 이동하겠습니다. 모든 클래스가 캐싱의 혜택을받는 것은 아니므로 두 번째 수준 캐시를 비활성화 할 수 있어야합니다.

Hibernate 2 단계 캐시는 두 단계로 설정됩니다. 먼저 사용할 동시성 전략을 결정해야합니다. 그런 다음 캐시 공급자를 사용하여 캐시 만료 및 물리적 캐시 속성을 구성합니다.

동시성 전략

동시성 전략은 데이터 항목을 캐시에 저장하고 캐시에서 검색하는 중개자입니다. 2 단계 캐시를 활성화하려면 각 영구 클래스 및 컬렉션에 대해 사용할 캐시 동시성 전략을 결정해야합니다.

  • Transactional − 드물게 업데이트되는 경우에도 동시 트랜잭션에서 오래된 데이터를 방지하는 것이 중요한 대부분의 읽기 데이터에이 전략을 사용합니다.

  • Read-write − 드물게 업데이트되는 경우에도 동시 트랜잭션에서 오래된 데이터를 방지하는 것이 중요한 대부분의 읽기 데이터에 대해이 전략을 다시 사용하십시오.

  • Nonstrict-read-write−이 전략은 캐시와 데이터베이스 간의 일관성을 보장하지 않습니다. 데이터가 거의 변경되지 않고 오래된 데이터의 작은 가능성이 중요하지 않은 경우이 전략을 사용하십시오.

  • Read-only− 절대 변하지 않는 데이터에 적합한 동시성 전략. 참조 데이터로만 사용하십시오.

2 단계 캐싱을 사용하려는 경우 Employee 클래스에서 Hibernate에게 읽기-쓰기 전략을 사용하여 Employee 인스턴스를 캐시하도록 지시하는 데 필요한 매핑 요소를 추가하겠습니다.

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

usage = "read-write"속성은 Hibernate에게 정의 된 캐시에 대해 읽기-쓰기 동시성 전략을 사용하도록 지시합니다.

캐시 제공자

동시성 전략을 고려한 후 다음 단계에서는 캐시 후보 클래스를 사용하여 캐시 공급자를 선택합니다. Hibernate는 전체 애플리케이션에 대해 단일 캐시 공급자를 선택하도록합니다.

Sr. 아니. 캐시 이름 및 설명
1

EHCache

메모리 또는 디스크 및 클러스터 된 캐싱에 캐시 할 수 있으며 선택적 Hibernate 쿼리 결과 캐시를 지원합니다.

2

OSCache

풍부한 만료 정책 및 쿼리 캐시 지원을 통해 단일 JVM에서 메모리 및 디스크에 대한 캐싱을 지원합니다.

warmCache

JGroups를 기반으로하는 클러스터 캐시. 클러스터 된 무효화를 사용하지만 Hibernate 쿼리 캐시를 지원하지 않습니다.

4

JBoss Cache

JGroups 멀티 캐스트 라이브러리를 기반으로하는 완전 트랜잭션 복제 클러스터 캐시입니다. 복제 또는 무효화, 동기 또는 비동기 통신, 낙관적 및 비관적 잠금을 지원합니다. Hibernate 쿼리 캐시가 지원됩니다.

모든 캐시 공급자가 모든 동시성 전략과 호환되는 것은 아닙니다. 다음 호환성 매트릭스는 적절한 조합을 선택하는 데 도움이됩니다.

전략 / 제공자 읽기 전용 Nonstrictread-write 읽기-쓰기 거래
EHCache 엑스 엑스 엑스  
OSCache 엑스 엑스 엑스  
SwarmCache 엑스 엑스    
JBoss 캐시 엑스     엑스

hibernate.cfg.xml 구성 파일에서 캐시 공급자를 지정합니다. 2 단계 캐시 공급자로 EHCache를 선택합니다.

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

이제 캐시 영역의 속성을 지정해야합니다. EHCache에는 자체 구성 파일이 있습니다.ehcache.xml, 애플리케이션의 CLASSPATH에 있어야합니다. Employee 클래스에 대한 ehcache.xml의 캐시 구성은 다음과 같습니다.

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

이제 Employee 클래스와 Hibernate에 대해 2 단계 캐싱이 활성화되었습니다. 이제 Employee로 이동할 때마다 또는 식별자로 Employee를로드 할 때 2 단계 캐시에 도달합니다.

모든 클래스를 분석하고 각 클래스에 대해 적절한 캐싱 전략을 선택해야합니다. 경우에 따라 2 단계 캐싱으로 인해 응용 프로그램의 성능이 저하 될 수 있습니다. 따라서 캐싱을 활성화하지 않고 먼저 애플리케이션을 벤치마킹하고 나중에 적합한 캐싱을 활성화하고 성능을 확인하는 것이 좋습니다. 캐싱이 시스템 성능을 향상시키지 않는다면 어떤 유형의 캐싱도 활성화 할 필요가 없습니다.

쿼리 수준 캐시

쿼리 캐시를 사용하려면 먼저 다음을 사용하여 활성화해야합니다. hibernate.cache.use_query_cache="true"구성 파일의 속성. 이 속성을 true로 설정하면 Hibernate가 쿼리 및 식별자 집합을 보유하는 데 필요한 캐시를 메모리에 생성하도록합니다.

다음으로 쿼리 캐시를 사용하려면 Query 클래스의 setCacheable (Boolean) 메서드를 사용합니다. 예를 들면-

Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();

Hibernate는 또한 캐시 영역의 개념을 통해 매우 세분화 된 캐시 지원을 지원합니다. 캐시 영역은 이름이 지정된 캐시의 일부입니다.

Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();

이 코드는 캐시의 직원 영역에서 쿼리를 저장하고 찾도록 Hibernate에 지시하는 메소드를 사용합니다.