Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 惰性集合初始化后不会释放休眠连接_Java_Spring_Hibernate_Connection Pooling_C3p0 - Fatal编程技术网

Java 惰性集合初始化后不会释放休眠连接

Java 惰性集合初始化后不会释放休眠连接,java,spring,hibernate,connection-pooling,c3p0,Java,Spring,Hibernate,Connection Pooling,C3p0,从3.6升级到hibernate 4.2.4后,初始化惰性集合后,数据库连接不会返回到池中。因此,当用户数超过连接池中的连接数时,连接池将很快耗尽。 在中描述了类似的症状,但我们在Hibernate 3.1-3.6中没有观察到这些问题 相关设置: hibernate.connection.autocommit=true hibernate.connection.release_mode=after_transaction 集合初始化后,没有打开的事务。因此,根据设置,必须释放连接 在hiber

从3.6升级到hibernate 4.2.4后,初始化惰性集合后,数据库连接不会返回到池中。因此,当用户数超过连接池中的连接数时,连接池将很快耗尽。 在中描述了类似的症状,但我们在Hibernate 3.1-3.6中没有观察到这些问题

相关设置:

hibernate.connection.autocommit=true
hibernate.connection.release_mode=after_transaction
集合初始化后,没有打开的事务。因此,根据设置,必须释放连接

在hibernate 3.6中,通过从OneToManyLoader间接调用ConnectionManager.AccessiveRelease来释放连接。 这对于我们的使用场景来说是非常关键的变化。这种改变是故意的吗?是否可以通过一些设置组合来激活旧行为?

我们找到了一个解决方法。有人看到缺点吗


另一个基于InitializeCollectionEventListener的解决方案。。。那么您检查过entityManager.getReference方法了吗?
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(); 
        }
    }

}