2013-10-02 39 views
1

從3.6升級到hibernate 4.2.4之後數據庫連接在初始化延遲收集後不會返回到池。因此,當用戶數超過池中的連接數時,連接池會非常快速地耗盡。 類似症狀HHH-4808描述,但我們還沒有在Hibernate中觀察到的這些問題3.1-3.6延遲收集初始化後,不會釋放Hibernate連接

相關設置:

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

集合初始化後沒有打開的事務。所以根據設置連接必須被釋放。

在hibernate 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(); 
     } 
    } 

}