2010-04-15 1 views
2

필자는 빈번한 간격이나 트리거로 데이터베이스의 상태를 읽도록 요구하는 응용 프로그램을 개발 중입니다. 그러나, 일단 세션을 명시 적으로 닫고 새로운 세션에서 엔티티를 읽지 않으면, 하이버 네이트가 상태를 읽으면 다시 읽지 않습니다.최대 절전 모드 세션을 자주 열고 닫는 것이 좋습니다.

엔티티를 읽은 다음 나중에 닫을 때마다 세션을 여는 것이 좋은 생각입니까? 얼마나 많은 오버 헤드가 응용 프로그램과 데이터베이스에 저장됩니까? (우리도 c3p0 연결 풀을 사용합니다)?

다시 읽으려면 세션에서 엔티티를 제거하는 것만으로 충분합니까?

답변

3

refresh을 사용하여 엔티티를 다시로드 할 수도 있습니다. 또는 evictclear, @ Bosho가 언급했듯이

연결 풀을 사용하면 세션을 열고 닫는 오버 헤드가 크지 않습니다. 세션 공장을 구성하는 데 시간이 걸립니다.

세션을 닫고 다시 열 때의 문제점은 잘 기억한다면 이미로드 된 개체가 여전히 분리된다는 것입니다. 이것은 게으른 로딩에 문제가 될 수 있습니다. 따라서 세션을 열린 상태로 유지하고 evict, clear 또는 refresh을 사용하는 것이 좋습니다.

엔티티를 제거하고 이미로드 된 엔티티 중 하나에 액세스하면 이전 데이터가 계속 유지됩니다.

MyEntity e = session.load(...); 
... 
session.evict(e);   // remove entity from the cache 
String p = e.myProperty; // still the value at the time it was loaded 
e = sesssion.load(...); // latest value 

당신이 경우, 엔티티가 조작 언제 먼저 갱신되어야한다고 말한다 디자인 가이드 라인을 소개하는 것이 더있을 수 있습니다.

MyEntity e = session.load(...); 
... 
session.refresh(e);  // refresh entity and cache 
String p = e.myProperty; // latest value 
e = sesssion.load(...); // latest value 

위 코드는 의사 코드 일 뿐이므로 확인하지 않았습니다.

세션이 특정 시간 동안 열리면 캐시가 커질 수 있으므로이 경우 여전히 clear 수 있습니다. 일반적으로 말하자면 캐시 증가 문제와 연결 시간 제한, 트랜잭션 시간 초과 및 잠금 경합 문제를 방지하기 위해 세션을 짧게 유지하는 것이 좋습니다.

0

예. evict() 개체입니다. 전체 세션을 지우려면 clear()입니다.

새 세션은 요청 (스레드) 또는 장기 실행 대화와 연관되어야합니다.

+0

나에게 세션 관련 및 비용에 관해 읽을만한 자료를 제공해 주시겠습니까? 나는 운이없이 그것을 봤다. – Gaurav

0

다른 테이블에 링크하는 컬럼의 경우 fetchtype을 LAZY로 설정하면 Hibernate는 명시 적으로 요청할 때까지 해당 데이터를로드하지 않습니다. 이렇게하면 많은 시간을 절약 할 수 있습니다.

Table에 열이 표시 될 수있다 : 당신이 Table.getOtherTable().getValue()처럼 뭔가를 할 때까지

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="other_table_id", nullable = false) 
private OtherTable otherTable; 

그래서, OtherTable 세션에로드됩니다 없습니다. 그래서 당신이 뭔가를하지 않으면, 당신은 또한 그것을 퇴출시킬 필요가 없습니다.

이것은 의사 코드이며 프로그램에 따라 약간 다를 수 있습니다.