할 때 최대 절전 모드를 내뿜는 세션을,그것은 어떻게 결정하는 개체의 세션에서는 더럽습니까?

StackOverflow https://stackoverflow.com/questions/82429

문제

내의 이해를 최대 절전 모드는 객체로 로드되는 데이터베이스로부터 그들이 추가됩니다.에서 다양한 포인트,구성에 따라 세션이 했습니다.이 시점에서 수정된 개체는 데이터베이스에 기록합니다.

최대 절전 모드는 어떻게 결정하는 개체는'더러운'해야 합니다.

지 프록시 생성되는하여 최대 절전 모드를 차단 할당 필드에 추가하고 객체를 더러운 목록에서 세션?

또는 최대 절전 모드에 보는 각 개체 세션과 비교하는 개체는 원래의 상태?

또는 완전히 다른 무언가?

도움이 되었습니까?

해결책

최대 절전 모드는 사용할 수 있습니다/바이트 코드의 생성(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 기본 더 확인하는 메커니즘 을 통과 현재 연결 엔티티와 일치하는 모든 속성에 대한 자신의 초기 적재간의 값입니다.

할 수 있습니다 더 나은 시각화를 이 과정에서 다음과 같은 다이어그램:

Default automatic dirty checking

이러한 답변이 불완전(에서 최고-나는 전문가가 여기에).이 있는 경우 히브 남자 엔터티 세션에서,당신은 아무것도 하지 않는다,당신은 여전히 얻을 수 있습니다 업데이트를 발행할 때 당신을 저장()니다.언제입니까?을 때 다른 세션 업체 간의 부하()및 저장().여기에는 나의 예: 최대 절전 모드 설정 더러운 플래그(및 문제 업데이트)더라도 클라이언트을 변경하지 않은 값

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top