2012-04-09 3 views
18

나는 둘 사이에 조금 혼란 스럽다. 두 경우 모두 동면 세션을 반환한다는 것을 알고 있으므로 SessionFactory.getCurrentSession()은 hibernate.cfg.xml에 설정된 <property name="current_session_context_class"> 속성을 기반으로 문맥 세션을 반환합니다. 항상이 접근 방식을 사용하지 않아야합니까?차이점 Hibernate의 Sessionfactory.getCurrentSession()과 SessionFactory.openSession()

어떤 추가 값이 SessionFactory.openSession()에 의해 추가됩니까?

답변

37

sf.getCurrentSession()을 처음 호출 할 때마다 세션이 열립니다. 기존 세션이없는 경우 새 세션을 생성하고 기존 세션이있는 경우 기존 세션을 사용합니다.

톰캣에서 이는 기본 ThreadLocal 개체를 사용하여 생성 된 스레드와 세션을 연결합니다. 그러나 Tomcat은 스레드 풀링을 사용하기 때문에 요청이 이미 세션과 연결된 세션을 수신 할 수 있으므로 완전히 새로운 세션을 만들지 않을 가능성이 있습니다. 또 다른 한 가지는 sf.getCurrentSession()으로 얻은 세션이 자동으로 플러시되고 닫히는 것입니다.

반면에 sf.openSession() 메서드는 새 세션을 만들지 만 스레드와 연결하려고하지는 않습니다. 그러나 sf.openSession()은 Hibernate가 자동으로 세션을 종료하고 플러시하는 것을 사용자가 예상한다는 점에서 또 다른 문제점을 안고 있음을 기억하십시오.

sf.getCurrentSession()이면 일반적으로 충분합니다. sf.openSession()은 세션이 저장되고 관리되는 위치에 대한 더 높은 수준의 관리를 제공하고 용이하게합니다. 확실히 고급 옵션입니다.

+1

그렇다면 tomcat 내부에 다중 스레드 용으로 sf.getCurrentSession을 사용하면 동일한 세션을 사용하게됩니까? 괜찮 니? – Dejell

관련 문제