최대 절전 모드의 첫 번째 및 두 번째 수준 캐시는 무엇입니까?


245

누구든지 Hibernate의 1 단계 및 2 단계 캐싱이 무엇인지 간단한 단어로 설명 할 수 있습니까?

답변:


300

1.1) 1 차 캐시

첫 번째 레벨 캐시는 항상 세션 오브젝트 와 연관됩니다 . 최대 절전 모드는 기본적으로이 캐시를 사용합니다. 여기서는 하나의 트랜잭션을 차례로 처리하므로 한 트랜잭션을 여러 번 처리하지 않습니다. 주로 주어진 트랜잭션 내에서 생성해야하는 SQL 쿼리 수를 줄입니다. 즉, 트랜잭션에서 수행 된 모든 수정 후에 업데이트하는 대신 트랜잭션이 끝날 때만 트랜잭션을 업데이트합니다.

1.2) 2 차 캐시

2 단계 캐시는 항상 Session Factory 객체 와 연결됩니다 . 트랜잭션을 실행하는 동안 트랜잭션 사이에 세션 팩토리 레벨에서 오브젝트를로드하므로 해당 오브젝트는 단일 사용자에 바인드되지 않고 전체 애플리케이션에서 사용 가능합니다. 오브젝트는 캐시에 이미로드되어 있으므로 쿼리에서 오브젝트가 리턴 될 때마다 데이터베이스 트랜잭션을 수행 할 필요가 없습니다. 이런 식으로 두 번째 수준 캐시가 작동합니다. 여기서 쿼리 수준 캐시도 사용할 수 있습니다.

인용 : http://javabeat.net/introduction-to-hibernate-caching/


38
세션 오브젝트가있는 첫 번째 레벨 캐시 및 세션 팩토리 오브젝트가있는 두 번째 레벨 캐시를 맵핑하는 경우 +1 나는 계속 읽을 필요조차 없습니다.
Mahes

1
1 단계 캐시. 대부분의 경우 필요하지 않지만 제거 할 수있는 옵션이 없습니다. 그러나 당신은 그것에 대해 항상 생각해야합니다 ..
ses

6
@ses 대부분의 경우 1 단계 캐시가 필요합니다. 그렇지 않으면 N + 1 쿼리와 같은 매우 나쁜 성능 문제가 발생하거나 프리 페치 캐시가 열성적이지 않거나 속성에 액세스 할 때마다 한 번씩 쿼리됩니다.
Dennis C

일반적으로 우리는 매우 짧은 시간 동안 세션을 사용하고 매우 짧은 시간 동안 세션을 사용합니다. 심지어 그 기간 동안 캐시를 사용하지 않습니다. 세션이 오래 지속되면 세션에서 데이터 (예 : 편집 양식)를 분리합니다. 오래 지속되는 세션을 위해 복잡한 요청 후 요청을 작성하는 동안 query-session-api를 사용하려고 할 때 하나의 시나리오에만 필요한 것 같습니다.
ses

1
@DennisCheung : 링크가 죽었습니다. javabeat.net/introduction-to-hibernate-caching으로
NewUser

118

Streamline Logic 블로그 에서 첫 번째 수준 캐싱에 대한 좋은 설명이 있습니다.

기본적으로 첫 번째 레벨 캐싱은 두 번째 레벨 캐싱이 여러 세션에서 공유 될 수있는 세션별로 수행됩니다.


20
그것은 바로 거기에 간단한 단어입니다, 나는 그들이 왜 그것을 설명하는 데
어려움을 겪고 있는지 모르겠다

hehe ... 그래, 난 내가 어떻게 훨씬 간단하게 얻을 수 있었는지 모르겠어요 :)
lomaxx

2
이것은 실제로 더 명확합니다. 첫 번째는 세션 당 두 번째 세션은 멀티 세션 용이며, 기억하기 간단합니다. 두 번 투표 할 수 없습니까? : D
black sensei

1
1 단계 캐시가 필요한 이유는 샘플이 아닙니다. 대부분의 경우 그것은 전혀 필요하지 않습니다. 하지만 당신은 항상 그것에 대해 생각해야합니다.
ses

이 답변 이후 11 년 동안 불행히도 링크는 현재 존재하지 않습니다. :하지만 그 아카이브 웹 페이지의 콘텐츠를 찾을 수 web.archive.org/web/20081207044228/http://...
Golu

105

최대 절전 모드 캐시에 대한 기본 설명은 다음과 같습니다.

첫 번째 수준 캐시는 "세션"개체와 연결됩니다. 캐시 개체의 범위는 세션입니다. 세션이 종료되면 캐시 된 객체는 영구적으로 사라집니다. 첫 번째 수준 캐시는 기본적으로 활성화되어 있으며 비활성화 할 수 없습니다. 엔터티를 처음 쿼리하면 데이터베이스에서 엔터티를 검색하여 최대 절전 모드 세션과 관련된 첫 번째 수준 캐시에 저장합니다. 동일한 세션 객체로 동일한 객체를 다시 쿼리하면 캐시에서로드되고 SQL 쿼리가 실행되지 않습니다. 로드 된 엔티티는 evict()메소드를 사용하여 세션에서 제거 할 수 있습니다 . 이 엔티티의 다음로드는 evict()메소드를 사용하여 제거 된 경우 데이터베이스 호출을 다시 수행합니다 . clear()방법을 사용하여 전체 세션 캐시를 제거 할 수 있습니다 . 캐시에 저장된 모든 엔티티를 제거합니다.

두 번째 레벨 캐시는 세션 팩토리 범위에서 전체적으로 사용할 수있는 첫 번째 레벨 캐시와 다릅니다. 두 번째 레벨 캐시는 세션 팩토리 범위에서 작성되며 특정 세션 팩토리를 사용하여 작성된 모든 세션에서 사용할 수 있습니다. 또한 세션 팩토리가 닫히면 이와 관련된 모든 캐시가 죽고 캐시 관리자도 닫힙니다. 최대 절전 모드 세션이 엔티티를로드하려고 할 때마다 첫 번째 레벨 캐시에서 첫 번째 레벨 캐시에서 캐시 된 엔티티 사본을 찾습니다 (특정 최대 절전 모드 세션과 연관 됨). 캐시 된 엔터티 복사본이 첫 번째 수준 캐시에 있으면로드 방법의 결과로 반환됩니다. 첫 번째 수준 캐시에 캐시 된 엔터티가 없으면 캐시 된 엔터티에 대해 두 번째 수준 캐시가 조회됩니다. 두 번째 레벨 캐시에 엔티티가 캐시 된 경우로드 메소드의 결과로 리턴됩니다. 그러나, 엔터티를 반환하기 전에 엔터티에 대한 다음로드 메서드 호출이 첫 번째 수준 캐시 자체에서 엔터티를 반환하므로 다시 두 번째 수준 캐시로 이동할 필요가 없도록 엔터티를 1 수준 캐시에 저장합니다. 엔티티가 1 레벨 캐시 및 2 레벨 캐시에서도 발견되지 않으면 데이터베이스 쿼리가 실행되고 엔티티는 응답으로 리턴되기 전에 두 캐시 레벨 모두에 저장됩니다.load() 방법.


2
훌륭한 설명! 시퀀스 다이어그램을 그릴 수 있다면 굉장합니다!
Adelin

철저하고 좋은 설명
ManishS

1
이미 알고있는 내용을 수정하려는 경우 Dennis C와 Iomaxx의 위의 두 가지 대답은 훌륭하고 간결하며 기억하기 쉽습니다. 그러나 아직 모르는 경우의 차이점에 대한 설명을 찾고 있다면이 대답이 훨씬 좋습니다!
학생 영혼

대단한 설명 !!
blu3

17

이것은 매우 일반적인 질문이므로이 답변은 내 블로그에 쓴 이 기사를 기반으로 합니다 .

1 차 캐시

최대 절전 모드는 마지막 가능한 순간까지 지속 컨텍스트 플러시를 지연 시키려고합니다. 이 기사 에서 설명했듯이이 전략은 전통적으로 트랜잭션 쓰기 숨김으로 알려져 있습니다.

쓰기 숨김은 논리적 또는 물리적 트랜잭션보다는 최대 절전 모드 플러시와 관련이 있습니다. 트랜잭션 중에 플러시가 여러 번 발생할 수 있습니다.

여기에 이미지 설명을 입력하십시오

플러시 된 변경 사항은 현재 데이터베이스 트랜잭션에 대해서만 표시됩니다. 현재 트랜잭션이 커밋 될 때까지 다른 동시 트랜잭션에서 변경 내용을 볼 수 없습니다.

첫 번째 수준의 캐시로 인해 Hibernate는 여러 가지 최적화를 수행 할 수 있습니다.

2 차 캐시

적절한 캐싱 솔루션은 여러 Hibernate 세션에 걸쳐 있어야하므로 Hibernate가 추가 2 차 수준 캐시를 지원하는 이유입니다.

두 번째 수준 캐시는 SessionFactory 수명주기에 바인딩되므로 SessionFactory닫을 때만 (일반적으로 응용 프로그램이 종료 될 때) 소멸됩니다 . 두 번째 수준 캐시는 선택적 엔터티 캐싱 솔루션도 지원하지만 주로 엔터티 기반 지향입니다.

자세한 내용은 이 기사를 확인 하십시오 .


3

기본적으로 NHibernate는 세션 객체 기반의 1 차 캐싱을 사용합니다. 그러나 다중 서버 환경에서 실행중인 경우 첫 번째 레벨 캐시는 일부 성능 문제와 함께 확장 성이 떨어질 수 있습니다. 데이터가 여러 서버에 분산되어 있기 때문에 데이터베이스를 자주 방문해야하기 때문에 발생합니다. 다시 말해 NHibernate는 기본적이지 않은 정교한 In-process L1 캐시를 기본적으로 제공합니다. 그러나 캐싱 솔루션이 응용 프로그램 성능에 현저한 영향을 미쳐야하는 기능은 제공하지 않습니다.

따라서이 모든 문제의 문제는 세션 팩토리 객체와 관련된 L2 캐시를 사용하는 것입니다. 데이터베이스에 소요되는 시간이 단축되어 궁극적으로 앱 응답 시간이 늘어납니다.


1

퍼스트 레벨 캐시

세션 오브젝트는 첫 번째 레벨 캐시 데이터를 보유합니다. 기본적으로 활성화되어 있습니다. 첫 번째 수준 캐시 데이터는 전체 응용 프로그램에서 사용할 수 없습니다. 응용 프로그램은 많은 세션 개체를 사용할 수 있습니다.

2 차 캐시

SessionFactory 오브젝트는 두 번째 레벨 캐시 데이터를 보유합니다. 두 번째 수준 캐시에 저장된 데이터는 전체 응용 프로그램에서 사용할 수 있습니다. 그러나 명시 적으로 활성화해야합니다.


-4

두 번째 레벨 캐시에서 도메인 hbm 파일은 키를 변경할 수 있으며 값은 false 일 수 있습니다. 예를 들어,이 도메인 클래스에서 하루 중 일부 기간은 보편적 진리로 일정하게 유지됩니다. 따라서 응용 프로그램 전체에서 불변으로 표시 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.