최대 절전 모드 openSession () vs getCurrentSession ()


130

JSP 웹 응용 프로그램에서 최대 절전 모드를 사용하는 방법에 대한 질문이 있습니다.

  1. 무엇에 대한 가치가 있어야 hibernate.current_session_context_class합니까?

  2. 그러면 다음 중 어느 것을 사용해야합니까? 그리고 왜?

     Session s = HibernateUtil.getSessionFactory().openSession();
     Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. 마지막으로 어느 것이 "웹 애플리케이션 당 하나의 세션"또는 "요청 당 하나의 세션"중 더 낫습니까?

답변:


145

이 포럼 게시물 에서 설명했듯이 1과 2는 관련이 있습니다. hibernate.current_session_context_class스레드로 설정 한 다음 세션을 여는 서블릿 필터와 같은 것을 구현하면을 사용하여 다른 곳에서 해당 세션에 액세스 할 수 있습니다 SessionFactory.getCurrentSession().

SessionFactory.openSession()작업이 완료되면 항상 닫아야하는 새 세션을 엽니 다. SessionFactory.getCurrentSession()컨텍스트에 바인딩 된 세션을 반환합니다.이를 닫을 필요는 없습니다.

Spring 또는 EJB를 사용하여 트랜잭션을 관리하는 경우 트랜잭션과 함께 세션을 열고 닫도록 구성 할 수 있습니다.

당신은 사용해서는 안 one session per web app- 세션이 스레드 안전 개체가 아닙니다 - 여러 스레드에 의해 공유 할 수 없습니다. 항상 "요청 당 하나의 세션"또는 "거래 당 하나의 세션"을 사용해야합니다.


정말 감사합니다, @gkamal. View 문서의 Open Session에서 코드를 봅니다 . 링크는 해당 문서를 가리 킵니다. 저자는 필터 사용을 제안합니다. 그의 필터 코드에서 그는 호출하지 않습니다 openSession()close(). 그는 전화 만한다 getCurrentSession(). 나는 그가 설정하는 생각 current_session_contextthread. 이제 이해 getCurrentSession()합니다. 그러나 언제 사용 해야하는지 모르겠습니다 openSession().
wannik

4
세션을 컨텍스트에 바인딩하지 않으려는 경우 OpenSession을 사용합니다. 컨텍스트에 바인딩 된 세션 이외의 다른 세션이 필요한 상황이 있습니다 (최대 절전 모드 인터셉터는 원래 세션을 사용할 수 없다는 제한이 있습니다).이 경우 currentSession 대신 OpenSession을 사용합니다. OpenSession은 명시 적으로 닫아야하는 새 세션을 만듭니다. 예를 들어, DAO 메서드에서는 OpenSession을 호출합니다. 세션을 사용하고 닫습니다.
gkamal

getCurrentSession ()을 사용하고 있습니다. 내가 리스너에서 초기화했기 때문에 필터가 아닌 것은보기에 괜찮습니다. MVC2 JSP로 서블릿을 사용하고 있습니다
샤리프에게

@gkamal-관련 질문이 Sessions있습니다. - 당신은 그것을 좀 도와 주시겠습니까 stackoverflow.com/questions/23351083/... . 고마워요
Erran Morad

IMO, 각 스레드가 자체 세션을 보유하고 하나의 세션 만 보유하도록하는 것이 좋습니다.
coderz

31

SessionFactory.openSession ()에 대해 이야기하면

  • 항상 새 Session 객체를 만듭니다.
  • 세션 객체를 명시 적으로 플러시하고 닫아야합니다.
  • 단일 스레드 환경에서는 getCurrentSession ()보다 느립니다.
  • 이 메소드를 호출하기 위해 특성을 구성 할 필요는 없습니다.

그리고 SessionFactory.getCurrentSession ()에 대해 이야기하면

  • 존재하지 않는 경우 새 세션을 작성하고, 그렇지 않으면 현재 최대 절전 모드 인 동일한 세션을 사용합니다.
  • 세션 객체를 플러시하거나 닫을 필요는 없습니다. 내부적으로 Hibernate에 의해 자동으로 처리됩니다.
  • 단일 스레드 환경에서는 openSession ()보다 빠릅니다.
  • 추가 속성을 구성해야합니다. "hibernate.current_session_context_class"는 getCurrentSession () 메소드를 호출합니다. 그렇지 않으면 예외가 발생합니다.

위의 답변은 webapp 당 단일 세션을 사용하지 말라고 지시합니다. 따라서 내가 사용한다면 getCurrentSession동일한 세션을 재사용하지 않습니까?
parsecer

9

openSession:을 호출 SessionFactory.openSession하면 항상 새 Session객체 가 만들어집니다 .

이러한 세션 개체를 명시 적으로 플러시하고 닫아야합니다.

세션 객체는 스레드로부터 안전 하지 않으므로 멀티 스레드 환경에서는 요청 당 하나의 세션 객체를 만들고 웹 응용 프로그램에서도 요청 당 하나의 세션을 만들어야합니다.

getCurrentSession:을 호출하면 SessionFactory.getCurrentSession최대 절전 모드이고 내부적으로 최대 절전 모드로 관리되는 세션 객체가 제공됩니다. 트랜잭션 범위에 바인딩됩니다.

를 호출하면 존재하지 않는 경우 SessionFactory.getCurrentSession새로 작성하고 Session, 그렇지 않으면 현재 최대 절전 모드의 동일한 세션을 사용하십시오. 트랜잭션이 종료되면 세션을 자동으로 플러시하고 닫으므로 외부에서 수행 할 필요가 없습니다.

단일 스레드 환경에서 최대 절전 모드를 사용하는 경우 getCurrentSession매번 새 세션을 만드는 것보다 성능이 빠르기 때문에 사용할 수 있습니다 .

메소드 를 사용 하려면 hibernate.cfg.xml 에 다음 특성을 추가해야합니다 getCurrentSession.

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>

서블릿이 각 요청에 대해 새 스레드를 열지 않습니까? 따라서 Java webapp 인 경우 이미 단일 스레드 환경이 아니십니까?
parsecer

0
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Parameter            |                                openSession                                 |                                          getCurrentSession                                          |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session  creation    | Always open new session                                                    | It opens a new Session if not exists , else use same session which is in current hibernate context. |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session close        | Need to close the session object once all the database operations are done | No need to close the session. Once the session factory is closed, this session object is closed.    |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Flush and close      | Need to explicity flush and close session objects                          | No need to flush and close sessions , since it is automatically taken by hibernate internally.      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Performance          | In single threaded environment , it is slower than getCurrentSession       | In single threaded environment , it is faster than openSession                                      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Configuration        | No need to configure any property to call this method                      | Need to configure additional property:                                                              |
|                      |                                                                            |  <property name=""hibernate.current_session_context_class"">thread</property>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+

-6

SessionFactory : "데이터베이스 당 애플리케이션 당 하나의 SessionFactory"(예를 들어, 애플리케이션에서 3 개의 데이터베이스를 사용하는 경우 각 DB 당 sessionFactory 객체를 생성해야합니다. 완전히 3 개의 sessionFactory를 생성해야합니다. 그렇지 않으면 하나의 DataBase One 세션이있는 경우 충분합니다).

세션 : "요청-응답주기를위한 1 개의 세션". 요청이 왔을 때 세션을 열 수 있으며 요청 프로세스 완료 후 세션을 닫을 수 있습니다. 참고 :-웹 응용 프로그램에 하나의 세션을 사용하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.