hibenate 의 2 급 캐 시 이야기
시 작 했 습 니 다. 평소 와 마찬가지 로 코드 를 올 립 니 다.
먼저 실체 클래스 보기:
public class User implements Serializable{
public Long id;
private String name;
private int age;
}
맵 파일 은 생략 하고 다 들 쓸 거 예요.
히 베 네 이 트 프로필 다시 보기:
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
우 리 는 provider 를 보 았 다.class 에서 우 리 는 ehcache 라 는 제공 클래스 를 지 정 했 기 때문에 ehcache. xml 을 classpath 에 넣 어야 합 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.path"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
다음은 테스트 방법 을 직접 살 펴 보 겠 습 니 다.
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User user where name = 'shun123'");
Iterator iter = query.iterate();
while(iter.hasNext()) {
System.out.println(((User)iter.next()).getName());
}
session.close();
Session session2 = sessionFactory.openSession();
Query query2 = session2.createQuery("from User user where name='shun123'");
Iterator iter2 = query2.iterate();
while(iter2.hasNext()) {
System.out.println(((User)iter2.next()).getName());
}
session2.close();
}
실행 후 볼 수 있 습 니 다:
Hibernate: select user0_.USER_ID as col_0_0_ from USER user0_ where user0_.USER_NAME='shun123'
Hibernate: select user0_.USER_ID as USER1_0_0_, user0_.USER_NAME as USER2_0_0_, user0_.age as age0_0_ from USER user0_ where user0_.USER_ID=?
shun123
Hibernate: select user0_.USER_ID as col_0_0_ from USER user0_ where user0_.USER_NAME='shun123'
shun123
검색 한 마디 만 실 행 했 을 뿐 두 번 째 검색 에 서 는 ID 를 꺼 내지 않 고 검색 한 것 을 볼 수 있 습 니 다. 이것 은 주로 2 급 캐 시 덕분 입 니 다.
다음은 테스트 방법 중의 코드 를 분석 해 보 겠 습 니 다.테스트 방법 에서 우 리 는 각각 두 개의 세 션 을 열 고 각각 두 개의 Query 를 만들어 같은 조 회 를 진행 했다.그러나 두 번 의 Session 은 캐 시 를 공유 할 수 있 습 니 다. 이것 이 바로 2 급 캐 시, Session Factory 급 캐 시 입 니 다.우리 의 Session 이 같은 Session Factory 에서 만 들 면 우 리 는 2 급 캐 시 를 공유 하여 데이터 베이스 와 의 상호작용 을 줄 일 수 있 습 니 다.
프로필 의 뜻 을 다시 한 번 살 펴 보 겠 습 니 다.
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
2 급 캐 시 를 사용 하려 면 먼저 설정 이 필요 합 니 다.
<property name="hibernate.cache.use_second_level_cache">true</property>
계좌 개설 2 급 캐 시 를 한 다음 통과:
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
2 급 캐 시 제공 클래스 를 지정 합 니 다. 일반적인 상황 에서 우 리 는 ehcache 를 사용 합 니 다. 다른 것 은 잠시 사용 하지 않 았 고 잘 모 르 기 때문에 잠시 말 하지 않 습 니 다.
방금 전의 예 와 같이 우 리 는 위의 두 개 만 설정 하면 정상적으로 실행 할 수 있 고 2 급 캐 시 를 이용 할 수 있 습 니 다.
그럼 세 번 째 문장 은 무엇 에 쓰 입 니까?
<property name="hibernate.cache.use_query_cache">true</property>
이 설정 은 검색 할 때 캐 시 를 사용 해 야 한 다 는 것 을 알려 줍 니 다. 이 방법 을 사용 하려 면 query. setCacheable (true) 을 사용 해 야 합 니 다.
코드 를 같이 봅 시다. (캐 시 를 사용 하지 않 습 니 다.)
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User user where name = 'shun123'");
List list = query.list();
for (int i = 0; i < list.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session.close();
Session session2 = sessionFactory.openSession();
Query query2 = session2.createQuery("from User user where name='shun123'");
List list2 = query2.list();
for (int i = 0; i < list2.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session2.close();
}
여기 서 출력 한 결 과 는:
Hibernate: select user0_.USER_ID as USER1_0_, user0_.USER_NAME as USER2_0_, user0_.age as age0_ from USER user0_ where user0_.USER_NAME='shun123'
shun123
Hibernate: select user0_.USER_ID as USER1_0_, user0_.USER_NAME as USER2_0_, user0_.age as age0_ from USER user0_ where user0_.USER_NAME='shun123'
shun123
우 리 는 캐 시 를 사용 하지 않 는 것 을 보 았 습 니 다. 왜냐하면 우 리 는 list 를 사 용 했 고 list 는 캐 시 에 대해 읽 지 않 는 것 만 썼 기 때 문 입 니 다.그래서 이곳 에 서 는 두 번 의 조 회 를 진행 할 것 이다.
그럼 수정 해 보 겠 습 니 다.
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User user where name = 'shun123'");
query.setCacheable(true);
List list = query.list();
for (int i = 0; i < list.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session.close();
Session session2 = sessionFactory.openSession();
Query query2 = session2.createQuery("from User user where name='shun123'");
query2.setCacheable(true);
List list2 = query2.list();
for (int i = 0; i < list2.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session2.close();
}
빨간색 코드 두 개 를 보 았 습 니 다. 이것 은 우리 가 추가 한 두 개의 캐 시 를 여 는 코드 입 니 다. 지금 우 리 는 결 과 를 보 았 습 니 다.
Hibernate: select user0_.USER_ID as USER1_0_, user0_.USER_NAME as USER2_0_, user0_.age as age0_ from USER user0_ where user0_.USER_NAME='shun123'
shun123
shun123
조회 가 한 번 밖 에 남지 않 았 는데, 왜 일 까요?그 두 개의 빨간색 코드 에서 우 리 는 캐 시 를 열 었 습 니 다. 기억 하 세 요. 두 번 사용 해 야 합 니 다.두 개의 query 를 모두 캐 시 가능 한 것 으로 설정 해 야 캐 시 를 조회 할 수 있 습 니 다.
Criteria 도 비슷 한 방법 입 니 다. 어떤 어린이 신발 들 이 Criteria 가 어떻게 썼 는 지 잊 어 버 리 지 않도록 코드 를 넣 겠 습 니 다.
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Criteria criteria1 = session.createCriteria(User.class);
criteria1.setCacheable(true);
criteria1.add(Restrictions.eq("name","shun123"));
List list = criteria1.list();
for (int i = 0; i < list.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session.close();
Session session2 = sessionFactory.openSession();
Criteria criteria2 = session2.createCriteria(User.class);
criteria2.setCacheable(true);
criteria2.add(Restrictions.eq("name","shun123"));
List list2 = criteria2.list();
for (int i = 0; i < list2.size(); i++){
System.out.println(((User)list.get(i)).getName());
}
session2.close();
}
우 리 는 결 과 를 본다.
Hibernate: select this_.USER_ID as USER1_0_0_, this_.USER_NAME as USER2_0_0_, this_.age as age0_0_ from USER this_ where this_.USER_NAME=?
shun123
shun123
똑 같 습 니 다. 캐 시 를 이용 하 였 습 니 다.2 급 캐 시 는 잠시 배 워 보 겠 습 니 다.앞으로 더 많은 고급 이 있 으 니 우 리 는 다시 천천히 공부 하 자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
XML이란 무엇입니까?이것은 저장, 검색 및 공유할 수 있는 형식으로 데이터를 저장하는 강력한 방법입니다. 가장 중요한 것은 XML의 기본 형식이 표준화되어 있기 때문에 시스템이나 플랫폼 간에 로컬 또는 인터넷을 통해 XML을 공유하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.