2010-05-08 5 views
4

세션이 플러시되거나 트랜잭션이 커밋되면 세션 자체가 최대 절전 모드로 닫힌다는 것을 읽었습니다. 그래서, 같은 스레드에서 이전에 닫혀 있던 Hibernate Session을 재사용 할 수 있습니까?스레드에서 Hibernate 세션 재사용

감사합니다.

답변

11

세션이 플러시되거나 트랜잭션이 커밋되면 세션 자체가 최대 절전 모드로 닫힙니다.

flush하지 세션을 닫는다. 당신이 current_session_context_class를 구성한 경우, 최대 절전 모드 3.1에서 시작하여 commit 세션 닫힙니다에 "thread"또는 "jta", 또는 당신은 TransactionManagerLookup (필수 JTA)를 사용하고 getCurrentSession() 경우.

Session session = factory.getCurrentSession(); 
Transaction tx = session.beginTransaction(); 

Product p = new Product(); 
session.persist(p); 
session.flush(); 
System.out.println(session.isOpen()); // prints true 

p.setName("foo"); 
session.merge(p); 
tx.commit(); 
System.out.println(session.isOpen()); // prints false 

this threa 개발과 이에 대한 배경에 대한 문서의 섹션 2.5. Contextual sessions을 참조하십시오

다음 코드는이 (여기 theadcurrent_session_context_class 세트)을 보여줍니다.

그래서 이전에 닫은 동일한 스레드에서 최대 절전 모드 세션을 재사용 할 수 있습니까?

중 하나는 내장 된 "managed"전략 (managedcurrent_session_context_class 속성을 설정) 사용하거나 ThreadLocalSessionContext에서 파생 된 사용자 정의 CurrentSessionContext를 사용하고 ThreadLocalSessionContet.isAutoCloseEnabled() 우선합니다.

다시, 위의 링크를 참조 또한 What about the extended Session pattern for long Conversations?

+0

세션을 또한 롤백 닫습니다하지 않을 경우 current_session_context_class "스레드"또는 "JTA"에? –

2

틀린입니다. 세션은 열려 있고 새로운 트랜잭션이 시작됩니다. 가장 중요한 것은 현재 세션에 연결된 모든 객체가 연결되어 있기 때문에 세션을 지우지 않으면 여기에 메모리 누수가있는 것입니다.

+0

는 항상 true –

관련 문제