2013-10-02 1 views
1

3.6에서 최대 절전 모드로 업그레이드 한 후, 데이터베이스 연결은 lazy collection의 초기화 후에 pool에 반환되지 않는다. 따라서 사용자 수가 풀의 연결 수를 초과하면 연결 풀이 매우 빨리 소모됩니다. 유사 증상이 HHH-4808에 설명되어 있지만, 우리는 Hibernate에서 3.1-3.6lazy collection 초기화 후 최대 절전 모드 연결이 해제되지 않는다.

관련 설정이 문제를 관찰하지 않은 : 컬렉션 열려있는 트랜잭션이 없습니다 초기화 후

hibernate.connection.autocommit=true 
hibernate.connection.release_mode=after_transaction 

합니다. 그래서 설정에 따라 연결을 해제해야합니다.

최대 절전 모드 3.6 연결이 해제되었습니다 (OneToManyLoader에서 ConnectionManager.aggresiveRelease()에 대한 간접 호출을 통해). 이것은 사용 시나리오에서 매우 중요한 변경 사항입니다. 이 변경이 의도적 이었습니까? 일부 설정 조합을 통해 이전 동작을 활성화 할 수 있습니까?

답변

0

해결 방법이 있습니다. 아무도 단점을 볼 수 있습니까?

EventListenerRegistry registry = ((SessionFactoryImpl)sessionFactory).getServiceRegistry().getService(EventListenerRegistry.class); 
registry.appendListeners(EventType.INIT_COLLECTION, new InitializeCollectionEventListener()); 

public class InitializeCollectionEventListener implements InitializeCollectionEventListener{ 
    DefaultInitializeCollectionEventListener defaultListener; 
    InitializeCollectionEventListener(){ 
     defaultListener = new DefaultInitializeCollectionEventListener(); 
    } 
    public void onInitializeCollection(InitializeCollectionEvent pEvent) throws HibernateException { 
     defaultListener.onInitializeCollection(pEvent); 
     SessionImpl si = (SessionImpl) pEvent.getSession(); 
     if (!si.isTransactionInProgress() && !si.isClosed() && si.isConnected() && 
       si.getConnectionReleaseMode().equals(ConnectionReleaseMode.AFTER_TRANSACTION)){ 
      si.getTransactionCoordinator().getJdbcCoordinator().getLogicalConnection().aggressiveRelease(); 
     } 
    } 

} 
관련 문제