从初始化延迟集合后,从3.6数据库连接升级到hibernate 4.2.4后,不会返回到池。因此,当用户数超过池中的连接数时,连接池会很快耗尽。 HHH-4808中描述了类似的症状,但我们在Hibernate 3.1-3.6
中没有发现这些问题相关设置:
hibernate.connection.autocommit=true
hibernate.connection.release_mode=after_transaction
初始化集合后,没有打开的事务。所以根据设置连接必须发布。
在hibernate 3.6中发布了连接(通过从OneToManyLoader间接调用ConnectionManager.aggresiveRelease())。 对于我们的使用场景,这是非常关键的变化。这种变化是故意的吗?是否可以通过某些设置组合激活旧行为?
答案 0 :(得分: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();
}
}
}