open Session()과 get Current Session()의 휴지 상태
JSP 웹 어플리케이션에서 휴지 상태를 사용하는 것에 대해 몇 가지 질문이 있습니다.
의 값은 어떻게 요?
hibernate.current_session_context_class
그럼 다음 중 어떤 문장을 사용해야 할까요?그리고 왜?
Session s = HibernateUtil.getSessionFactory().openSession(); Session s = HibernateUtil.getSessionFactory().getCurrentSession()
마지막으로 '웹 앱당 세션 1개'와 '요청당 세션 1개' 중 어느 것이 더 좋습니까?
이 포럼 투고에서 설명한 바와 같이 1과 2는 관련이 있습니다.설정했을 경우hibernate.current_session_context_class
후 하려면 , 「필터」를하고, 그 에서도 그 할 수 있습니다.그러면 다음 명령을 사용하여 어디서든 해당 세션에 액세스할 수 있습니다.SessionFactory.getCurrentSession()
.
SessionFactory.openSession()
는 항상 작업을 완료한 후 닫아야 하는 새 세션을 엽니다. SessionFactory.getCurrentSession()
는 컨텍스트에 바인드된 세션을 반환합니다.이것을 닫을 필요는 없습니다.
Spring 또는 EJB를 사용하여 트랜잭션을 관리하는 경우 트랜잭션과 함께 세션을 열거나 닫도록 구성할 수 있습니다.
.one session per web app
할 수 없습니다 세션은 여러 스레드로 공유할 수 없습니다.- 세션은 스레드 세이프 오브젝트가 아닙니다.'요청당 1회'를 사용해야 .
Session Factory.open Session()에 대해 이야기하면
- 항상 새로운 Session 객체를 만듭니다.
- Session 개체를 명시적으로 플러시하고 닫아야 합니다.
- 단일 스레드 환경에서는 getCurrentSession()보다 느립니다.
- 이 메서드를 호출하기 위해 속성을 설정할 필요는 없습니다.
SessionFactory.getCurrentSession()에 대해 설명하겠습니다.
- 존재하지 않는 경우 새 세션을 생성하거나 현재 휴지 상태 컨텍스트에 있는 동일한 세션을 사용합니다.
- 세션 개체를 플러시 및 닫을 필요가 없습니다. 내부 휴지 상태에 의해 자동으로 처리됩니다.
- 싱글 스레드 환경에서는 open Session()보다 빠릅니다.
- 추가 속성을 구성해야 합니다."hibernate.current_session_context_class"를 사용하여 getCurrentSession() 메서드를 호출합니다.그렇지 않으면 예외가 느려집니다.
openSession
할 때 : ★★★★★★★★★★★★★★★★*SessionFactory.openSession
, 새로운, 새로운 것을 냅니다.Session
이치노
이러한 세션 개체를 명시적으로 플러시하고 닫아야 합니다.
Session 객체는 스레드 세이프가 아니기 때문에 멀티 스레드 환경에서는 요청당 1개의 세션개체를 생성하고 웹 애플리케이션에서도 요청당 1개의 세션을 생성해야 합니다.
getCurrentSession
: 전화할 때SessionFactory.getCurrentSession
하이버네이션 컨텍스트에서 내부 하이버네이션에 의해 관리되는 Session 객체를 제공합니다.거래 범위에 따라 다릅니다.
전화할 때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> |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
Session Factory: "One Session Factory per applications per DataBase" (예를 들어 어플리케이션에서 3개의 DataBase를 사용하는 경우 DB마다 Session Factory 객체를 생성해야 합니다.데이터베이스가 1개밖에 없는 경우에는 1개의 세션으로 충분합니다.)
세션: "1개의 요청-응답 사이클에 대해 1개의 세션"요청이 왔을 때 세션을 열 수 있으며 요청 프로세스가 완료된 후 세션을 닫을 수 있습니다.참고: - 웹 응용 프로그램에 하나의 세션을 사용하지 마십시오.
언급URL : https://stackoverflow.com/questions/8046662/hibernate-opensession-vs-getcurrentsession
'programing' 카테고리의 다른 글
'-rdynamic'은 정확히 어떤 역할을 하며 언제 필요할까요? (0) | 2022.09.05 |
---|---|
MYSQL DATEFF에만 시간 표시 (0) | 2022.09.05 |
'blur' 이벤트가 발생할 때 어떤 요소의 포커스가 *to*로 갔는지 어떻게 알 수 있습니까? (0) | 2022.09.05 |
PHP 오브젝트에서 json_encode 사용(범위에 관계없이) (0) | 2022.09.05 |
VUE.JS - vNode 인수를 사용하여 알 수 없는 수량의 항목을 동적 탐색에 추가 (0) | 2022.09.05 |