2008-09-23 4 views
3

이것이 주관적 질문인데 왜 Hibernate는 짧은 세션 동안 디자인 된 것처럼 보입니까? 일반적으로 내 응용 프로그램에서는 데이터 계층을 추상화하는 DAO를 만듭니다. 그러나 엔티티 객체를 사용하는 방법을 예측할 수 없기 때문에 일부 컬렉션이 느리게로드되거나 세션이 닫히면로드하지 못하게됩니다.왜 Hibernate는 수명이 짧은 세션을 위해 설계된 것입니까?

왜 자동으로 세션을 다시 열거 나 세션을 항상 열어 둘 수 있도록 디자인하지 않았습니까?

답변

4

일단 트랜잭션 경계를 벗어나면 새 트랜잭션을 시작하지 않고 데이터베이스를 다시 히트 할 수 없습니다. 'just in case'를 장기간 실행하는 것은 나쁜 일 (tm)입니다.

보기에서 객체를 느슨하게로드하려고합니다. 일부 옵션은 here입니다. 나는 정확히 얼마나 많은 객체 맵이 세션 facade 메소드에 의해 리턴 될지를 정의하는 것을 선호한다. 이를 통해 단원 테스트가 쉬워지고 비즈니스 계층의 성능을 테스트 할 수 있습니다.

1

본질적으로 세션을 투명하게 다시 열어야 할 때를 감지하는 개념적 필터 (때로는 서블릿 필터로 구현 됨) 인 OpenSessionInView 패턴을 찾고 있습니다. 여러 프레임 워크가이를 구현하여 자동으로 처리합니다.

1

데스크톱 응용 프로그램을 작성 중이므로 필터를 사용할 수 없습니다.

+0

객체를 게을리로드하거나 자신의 캐싱 코드를 작성하여 데이터 모델에 지연로드하지 마십시오. – RichH

0

연결은 부족한 자원이므로 사용하는 즉시 재활용해야합니다. 연결 풀링을 사용하는 경우 필요할 때 다른 연결 풀링을 얻는 것이 빠릅니다. 이것은 웹 사이트 규모를 확장하는 데 사용해야하는 아키텍처입니다. 데스크톱 응용 프로그램 인 경우에도 유스 케이스는 확장 가능한 사이트에만 집중할 수 있습니다.

MS ADO.NET을 보면 짧은 시간 동안 연결을 유지하는 데 많은 초점을 맞출 것입니다. 단절된 데이터를 업데이트 한 다음 준비가되면 데이터베이스에 적용하기위한 전체 오프라인 모델이 있습니다.

2

나는 EJB와 최대 절전 모드를 사용하는 데스크톱 응용 프로그램에서 작업했습니다. 객체가 직렬화되면 백엔드에서 가져올 수있는 능력이 없어 지므로 어디서나 lazy=false을 설정해야했습니다. 불행히도 그것이 어떻게 진행되는지입니다.

성능에 관심이 있다면, 게으른 가져 오기가 고통스럽지 않도록 백엔드에서 캐싱을 사용할 수 있습니다.

+0

lazy를 false로 설정하면 안됩니다. 쿼리에서 조인 페칭을 사용하여 초기화 스키마를 재정의하는 것이 좋습니다. – bpapa

0

Hibernate는 객체를 관계형 데이터베이스 테이블에 매핑하는 방법으로 설계되었습니다. 그것은 그 일을 아주 잘 수행합니다. 그러나 그것은 항상 모든 사람을 기쁘게 할 수는 없습니다. 나는 초기화가 어떻게 작동하는지 배우는 것에 약간의 복잡성이 있다고 생각한다. 그러나 일단 당신이 그것을 걸면, 그것은 의미가있다. 나는 그것이 반드시 당신을 분노하게하기 위해 반드시 "설계된"것인지 아닌지를 모른다. 그것은 그것이 일어난 방법 일 뿐이다.

webapp이 아닌 세션에서 마술로 세션을 다시 열려면 프레임 워크 학습의 복잡성이 이점보다 훨씬 비싸다고 생각합니다.

+0

나는 그때까지 화가 났다고 결코 말하지 않았다. 디자인 결함으로 본 것을 주목하십시오. –

관련 문제