JSP 웹 응용 프로그램에서 최대 절전 모드를 사용하는 방법에 대한 질문이 있습니다.
-
무엇에 대한 가치가 있어야
hibernate.current_session_context_class
합니까? -
그러면 다음 중 어느 것을 사용해야합니까? 그리고 왜?
Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession()
-
마지막으로 어느 것이 “웹 애플리케이션 당 하나의 세션”또는 “요청 당 하나의 세션”중 더 낫습니까?
답변
이 포럼 게시물 에서 설명했듯이 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 개의 세션”. 요청이 왔을 때 세션을 열 수 있으며 요청 프로세스 완료 후 세션을 닫을 수 있습니다. 참고 :-웹 응용 프로그램에 하나의 세션을 사용하지 마십시오.
답변
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)