2012-01-04 6 views
15

Spring에서 Hibernate 세션의 "lifecycle"은 어떻게 올바르게 수행되어야 하는가? Spring + Hibernate 세션 생명주기

SessionFactory

는 스프링에 의해 자동으로 생성되며, 글래스 피시 연결 풀에서의 DB 연결을하고있다. 지금은 SessionFactory.getCurrentSession()을 통해 최대 절전 모드 세션을 얻고 있습니다. 그런 다음 트랜잭션을 시작하고 작업을 수행 한 후 commit() 또는 rollback() 끝에 있습니다. disconnect(), close(), flush() 또는 다른 어떤 동작을 언제든지 수행해야합니까? 연결이 풀로 제대로 되돌아 오거나 이미 스프링에 의해 자동으로 수행 된 모든 작업이 있습니까?

가 무엇을 수행해야 할 때, 아마도 누군가가 올바른 방향을 가리킬 수 있습니다 이해하는 순간에 나를 위해 약간의 혼란이 방법 듬뿍

? this 링크 세션 및 거래에 대한 여러분을 안내 할 것입니다

답변

12

SessionFactory가 Spring에 의해 자동으로 생성되기 때문에 Spring 프레임 워크는 연결을 종료합니다. 검사 할 경우 Spring Resource Management

을 확인 . 앱용 로깅을 사용하는 경우 로그를 확인할 수 있습니다. 그것은 수있을 것 같은 :

(주) INFO [AnnotationSessionFactoryBean] 닫기 최대 절전 모드의 SessionFactory

I this link

여기에 주요 계약에서 다음 줄은 세션 인스턴스의 생성이다 얻을 . 일반적으로 응용 프로그램에는 하나의 SessionFactory 인스턴스가 있고 클라이언트 요청을 처리하는 스레드 은이 팩토리에서 Session 인스턴스를 가져옵니다. SessionFactory의 내부 상태는 변경 불가능합니다. 이 생성되면이 내부 상태가 설정됩니다. 이 내부 상태에는 객체/관계형 매핑에 대한 모든 의 메타 데이터가 포함됩니다. 구현자가 스레드 세이프해야합니다.

+0

SessionFactory가 싱글 톤 bean으로 구성된 시스템에 있습니다. 따라서 닫히지 않을 것입니다 ... – Laimoncijus

+0

@Laimoncijus : SessionFactory는 기본적으로 싱글 톤입니다. 그에 따라 수정 된 답변. 그것을 확인하십시오 –

+0

그래서 sessionont 싱글 톤을 구성 할 필요가 없습니다. 또한이 답변을 확인하십시오. http://stackoverflow.com/questions/8523332/close-opened-hibernation-sessions-if-exist/8530891#8530891 –

2

희망.

그런 다음 트랜잭션을 시작한 다음 작업을 수행 한 다음 마지막에 을 커밋() 또는 롤백()합니다. 내가 제대로 다시 풀에 반환 또는 모든 이미 자동으로 스프링에 의해 수행 입니다 연결 될 것이다, 그래서 언제든지 분리와 같은 다른 작업(), 플러시 가까운(),() 또는 다른 사람을 어떻게해야합니까?

Transaction에서 commit()을 호출하면 세션이 자동으로 닫히고 궁극적으로 연결시 close 메소드가 호출되어 해당 풀로 돌아갑니다.

3

SessionFactory.getCurrentSession()을 통해 최대 절전 모드 쿼리를 실행하면 Spring은 연결을 열고 닫는 데 필요한 작업을 수행합니다. Spring 설정에서 사용중인 SessionFactory는 config.buildSessionFactory 메소드도 내부적으로 호출합니다.

이 중 대부분은 AbstractSessionFactoryBean의 구현에서 발생합니다. 커넥션의 종료는 settings.getConnectionProvider(). close(); 문을 사용하여 SessionFactoryImpl 클래스에서 hibernate에 의해 수행된다. . 즉, 최대 절전 모드는 모든 것을 수행합니다.Spring은 필요할 때 도움을 줄뿐입니다. 다시 연결 풀에 연결 출시 봄 .IT와는 아무 상관이없는 방법에 대한

6

정책은에서 org.hibernate.ConnectionReleaseMode

시작에 열거으로 식별되는 구성 매개 변수 hibernate.connection.release_mode을 통해 최대 절전 모드 자체로 구성되어 버전 3.1 이상인 경우 hibernate.connection.release_mode의 기본값은 이며 해당 ConnectionReleaseMode 값은 JTA 또는 JDBC 트랜잭션 사용 여부에 따라 다릅니다. JDBC 트랜잭션을 사용할 경우 ConnectionReleaseMode.AFTER_TRANSACTION (예 : after_transaction)으로 설정됩니다.

ConnectionReleaseMode.AFTER_TRANSACTION의 동작은 즉 : 연결이 그

당신은이 동작을 확인할 수 있습니다 transaction.commit() 또는 transaction.rollback() 중 하나를 호출뿐만 아니라 session.close()session.disconnect()를 호출하는 것입니다, 각 거래 후 연결 풀에 반환됩니다 hibernate documentation Section 11.5.