Persistence Context 캐시 제어하기
- Persistent 객체들의 스냅샷들을 캐시에 복사해둔다.
- 이 캐시들을 사용하여 dirty checking을 하여 persistent 객체들의 변경 사항들을 찾아낸다.
- 수천개의 객체들을 로딩하면, OutOfMemoryException을 내고 죽어버릴 수가 있다.
- 캐시를 줄이거나 메모리 공간을 제약하려면 다음과 같이 해야 한다.
- 필요한 객체만 Persistent 상태로 유지하라. 전체 객체 그래프를 모두 끌어오다가는...
- session.evict(object)를 사용해서 persistent 상태의 객체를 명시적으로 detached 시킬 수 있다.
- session.clear()를 사용해서 Persistent Context에 있는 모든 객체를 detached로 만들 수 있다. 이 녀석들은 dirty checking하지 않는다.
- session.setReadOnly(object, true)를 사용해서 특정 객체에 대해서는 dirty checking을 하지 않도록 설정할 수 있다. false를 주면 다시 한다. 객체의 상태는 바꾸지 않는다.
Persistent Context flushing 하기
- 하이버는 Persistent 객체들에 대한 변경 사항을 바로바로 DB에 반영하지 않는다.
- DB 요청을 최소화 할 수 있다.
- DB 롹킹 기간을 최소화 한다.
- JDBC batch API의 장점을 취할 수 있다.
- flush(): DB와 Persistent Context의 동기화
- Transaction(하이버의 API)이 commit() 될 때.
- 쿼리를 실행하기 전에..
- session.flush()를 호출 할 때.
- session.setFlushMode()를 사용할 수 있다. 기본값은 FlushMode.AUTO.
- FlushMode.COMMIT으로 설정하면
- 쿼리를 실행하기 전에.. 동기화를 하지 않는다.
- 오직 Transaction.commit()과 session.flush()를 할때 만 동기화한다.
- 쿼리 -> 수정 -> 쿼리 -> 수정. 이런 경우에 FlushMode를 Commit으로 설정해주면 효율적이다.
- FlushMode.MONUAL로 설정하면
- 오직 session.flush()를 호출 할 때만 동기화한다.
- FlushMode 제어는 나중에 Persistent Context를 Conversation으로 확장할 때 사용할 것이다.
- 중요한 것은 flush 처리의 성능은 persistent context의 크기에 따라 달라진다는 것이다.