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