할 때 최대 절전 모드를 내뿜는 세션을,그것은 어떻게 결정하는 개체의 세션에서는 더럽습니까?
문제
내의 이해를 최대 절전 모드는 객체로 로드되는 데이터베이스로부터 그들이 추가됩니다.에서 다양한 포인트,구성에 따라 세션이 했습니다.이 시점에서 수정된 개체는 데이터베이스에 기록합니다.
최대 절전 모드는 어떻게 결정하는 개체는'더러운'해야 합니다.
지 프록시 생성되는하여 최대 절전 모드를 차단 할당 필드에 추가하고 객체를 더러운 목록에서 세션?
또는 최대 절전 모드에 보는 각 개체 세션과 비교하는 개체는 원래의 상태?
또는 완전히 다른 무언가?
해결책
최대 절전 모드는 사용할 수 있습니다/바이트 코드의 생성(CGLIB)서 알 수 있도록 필드 더러운로 세터를 호출(또는 할당 분야 afaict).
이것은 바로 표시하는 현장/체로 더러운,그러나지 않의 수를 줄이는 객체를 할 필요가 더러운 확인하는 동시오.모든지 않은 영향을 미치의 구현 org.hibernate.engine.EntityEntry.requiresDirtyCheck()
.그 아직도 가 필드에 비해 확인에 대한 불결.
말을 위에 기반한 최근의 트롤 어업을 통해 원시 코드(3.2.6GA),무엇으로 하는 신뢰성이 추가됩니다.관심 지점은:
SessionImpl.flush()
트리거onFlush()
이벤트입니다.SessionImpl.list()
전화autoFlushIfRequired()
는 트리거onAutoFlush()
이벤트입니다.(테이블에 관심).는 쿼리를 호출할 수 있습니다흥미롭게도,아니 플러시 발생하는 경우에 없을 트랜잭션이 있습니다.- 모두들 이벤트 결국에서
AbstractFlushingEventListener.flushEverythingToExecutions()
, 는 끝까지(사이에 다른 흥미로운 위치에서)flushEntities()
. - 는 루프를 통해 모든 기업에서 세션(
source.getPersistenceContext().getEntityEntries()
)전화DefaultFlushEntityEventListener.onFlushEntity()
. - 당신은 결국에서
dirtyCheck()
.는 방법에는 몇 가지 최적화 wrt 을 CGLIB 더러운 깃발은,그러나 우리는 여전히 끝났다를 반복하는 모든 실체.
다른 팁
최대 절전 모드의 스냅샷을 주는 각 개체결되는 세션이 있습니다.에 플러시,각각의 개체 세션과 비교 해 스냅샷을 결정하는 것이 더럽습니다.SQL 문으로 발급이 필요하고,스냅샷을 업데이트를 반영하의 상태(지금은 깨끗한)세션 개체입니다.
모 org.hibernate.이벤트입니다.def.DefaultFlushEntityEventListener.dirtyCheck 모든 요소에 세션 간에 이 방법을 결정하는 경우 그것은 그러나 비교를 통해으로 손길이 닿지 않은 버전(에서 하나 캐시 또 하나의 데이터베이스에서).
Hibernate 기본 더 확인하는 메커니즘 을 통과 현재 연결 엔티티와 일치하는 모든 속성에 대한 자신의 초기 적재간의 값입니다.
할 수 있습니다 더 나은 시각화를 이 과정에서 다음과 같은 다이어그램:
이러한 답변이 불완전(에서 최고-나는 전문가가 여기에).이 있는 경우 히브 남자 엔터티 세션에서,당신은 아무것도 하지 않는다,당신은 여전히 얻을 수 있습니다 업데이트를 발행할 때 당신을 저장()니다.언제입니까?을 때 다른 세션 업체 간의 부하()및 저장().여기에는 나의 예: 최대 절전 모드 설정 더러운 플래그(및 문제 업데이트)더라도 클라이언트을 변경하지 않은 값