从 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.aggressiveRelease())。 这对于我们的使用场景来说是非常关键的改变。这个改变是故意的吗?是否可以通过某些设置组合来激活旧行为?
最佳答案
我们找到了解决方法。有人看到缺点吗?
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();
}
}
}
关于java - 延迟集合初始化后 Hibernate 连接不会释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140609/