hibenate 의 2 급 캐 시 이야기

8940 단어 xmlHibernatecache
지난번 에 우 리 는 함께 hibenate 의 1 급 캐 시 와 운영 과정 에서 의 관련 상 태 를 배 웠 습 니 다. 오늘 우 리 는 지난번 에 남 은 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 급 캐 시 는 잠시 배 워 보 겠 습 니 다.앞으로 더 많은 고급 이 있 으 니 우 리 는 다시 천천히 공부 하 자.

좋은 웹페이지 즐겨찾기