java - 延迟集合初始化后 Hibernate 连接不会释放

标签 java spring hibernate connection-pooling c3p0

从 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/

相关文章:

java - 在代码中而不是在 hibernate.cfg.xml 中添加实体映射

hibernate - 如何在 EJB3 (JPA) 和 Hibernate 中使用@Id 注释字段?

java - 在 Solaris 上使用 Java 的文件名重音

java - 空值的 Spring 格式化程序

Java Spring——在编译时识别语法错误(在 Eclipse 中)

java - Hibernate不创建表

java - 使用带有嵌入式 Jetty 的 Spring-Boot 在 Camel rest-component 上配置 SSL

Java鼠标位置

java - HttpSession 通过引用或值存储属性?

java - [ Spring ] : Request mapping nested Json with array inside it