[java] 최대 절전 모드 openSession () vs getCurrentSession ()

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

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

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

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



답변

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

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

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

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


답변

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

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

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

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

답변

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>


답변

+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| 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>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+


답변

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

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


답변