Session과 1차 캐시

작성자황정식|작성시간12.11.21|조회수223 목록 댓글 0

: 하이버네이트에서 하나의 Session은 내부적으로 캐시를 갖고 있는데 이 캐시를 1차 캐시라고 부르며 Session의 시작과 종료 사이에서만 사용된다. 1차 캐시에는 Session으로부터 읽어 온 객체나 세션을 통해 데이터베이스에서 저장된 객체 등이 보관된다.

예를 들어 하나의 Session에서 동일한 객체를 한번 이상 로딩하면, 첫번째에는 데이터베이스로부터 객체를 로딩하고, 그 이후에는 1차 캐시에 저장된 객체를 가져오게 된다.



Session session = sessionFactory.getCurrentSession();

session.beginTransaction();

Board boardResult1 = (Board)session.get(Board.class, board.getBoardSeq());   // 데이터베이스에서 로딩후, 1차 캐시에 저

                                                                                                                     장.

Board boardResult2 = (Board)session.get(Board.class, board.getBoardSeq());  // 1차 캐시에 저장된 객체를 로딩.


(boardResult1 == boardResult2); // true

session.close();

--> boardResult1과 boardResult2는 동일한 객체를 참조한다.



하이버네이트는 Session 범위 내에서 객체의 프로퍼티가 변경될 경우 자동으로 데이터베이스에 변경된 내용을 반영하는데, 경우에 따라서 Session 범위 내에서 값을 변경 하더라도 변경된 내용이 데이터베이스에 반영이 되지 않길 원할때가 있다.

이런 경우 아래와 같이 Session.evict() 메서드를 호출하여 영속객체를 준영속 객체로 변경하면 된다.

Session session = sessionFactory.getCurrentSession();

session.beginTransaction();

Board boardResult = (Board)session.get(Board.class, board.getBoardSeq());

session.evict(boardResult); // boardResult 객체가 준영속 상태로 변경된다.

boardResult.setTitle("새로운 타이틀"); // 프로퍼티 값을 변경하더라도 더 이상 데이터베이스에 반영되지 않는다.

--> 위와 같이 Session.evict() 메서드가 호출되면 boardResult 객체는 더이상 1차 캐시와 연결되지 않는 준영속 상태로 바뀐다. 따라서 이후에 Session 범위 내에서 boardResult 객체의 값을 변경하더라도 변경된 내용이 데이터베이스에 반영이 되지 않는다.


--> 현재 1차 캐시에 저장된 모든 객체에 대해 준영속 상태로 변경하고 싶다면 Session.clear() 메서드를 호출하면 된다.



다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼