休眠5:延迟加载后,数据库连接仍未释放(事务中为空闲) [英] Hibernate 5: db connections are still not released (idle in transaction) after lazy loading

查看:194
本文介绍了休眠5:延迟加载后,数据库连接仍未释放(事务中为空闲)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Hibernate 5中,在初始化惰性收集之后释放数据库连接仍然存在很大的麻烦。延迟初始化收集后的数据库连接保留在事务空闲中。因此,如果许多用户同时工作,则打开的连接数会急剧增加。



我们使用休眠版本5.0.12 java版本1.8.0_151 jsf 2.3 ,请勿使用Spring(ORM)。



有报告的问题Hibernate版本3.2.7- HHH-4808 -仍然开了7月的最后评论是在报告此错误后的3年后,但在版本5中仍未解决。甚至对于版本4.2都有解决方法(有什么缺点吗?):延迟集合初始化后,不会释放休眠连接。在版本5中,从此替代方法中删除了方法
.getJdbcCoordinator()。getLogicalConnection()。aggressiveRelease()



我认为许多开发人员必须使用非常流行的Hibernate的这种延迟加载,所以我不明白,为什么这个问题没有解决。那么,是否有任何解决方案或经过验证的解决方法?

解决方案

FoxyBOA Keith 我们正在为
摆弄解决方法延迟初始化集合后关闭连接(对于Hibernate版本5),还有我们类似的解决方案:

 公共类MyInitializeCollectionEventListener实现了InitializeCollectionEventListener {

private static final long serialVersionUID = 1L;

DefaultInitializeCollectionEventListener defaultListener;

@Override
公共无效onInitializeCollection(InitializeCollectionEvent initializeCollectionEvent)引发HibernateException {
defaultListener.onInitializeCollection(initializeCollectionEvent);
SessionImpl si =(SessionImpl)initializeCollectionEvent.getSession();
if(!si.isTransactionInProgress()&&
!si.isClosed()&&
si.isConnected()&&
si.getJdbcCoordinator ().getConnectionReleaseMode()。equals(ConnectionReleaseMode.AFTER_TRANSACTION)){

si.getJdbcCoordinator()。getLogicalConnection()。afterTransaction();
}
}

它适用于我们所有的测试,但是如果有任何缺点,我真的不知道...


In Hibernate 5 there are still big troubles with releasing database connections after initialization of lazy collection. Database connections after lazy initialization of collection are kept in "idle in transaction". So if many users work at the same time, count of open connections is increasing critically.

We use hibernate version 5.0.12, java version 1.8.0_151, jsf 2.3, don't use Spring (ORM).

There is reported issue for Hibernate version 3.2.7 - HHH-4808 - still opened. The last comment from july is 3 years later after this bug was reported and still not resolved in version 5.

I think we use recommended approach lazy loading of Hibernate. Even there exists a workaround (any drawback?) for version 4.2: Hibernate connections are not released after lazy collection initialization. Method .getJdbcCoordinator().getLogicalConnection().aggressiveRelease() from this workaround was removed in version 5.

I think a large number of developers have to use this lazy loading of very popular Hibernate, so I don't understand, why this issue is not resolved. So are there any solutions or verified workarounds?

解决方案

The same as FoxyBOA and Keith we are fiddling with a workaround how to close connection after lazy initialization of collection (for Hibernate version 5.) and there is our similar solution:

public class MyInitializeCollectionEventListener implements InitializeCollectionEventListener {

   private static final long serialVersionUID = 1L;

   DefaultInitializeCollectionEventListener defaultListener;

   @Override
   public void onInitializeCollection(InitializeCollectionEvent initializeCollectionEvent) throws HibernateException {
    defaultListener.onInitializeCollection(initializeCollectionEvent);
    SessionImpl si = (SessionImpl) initializeCollectionEvent.getSession();
    if (!si.isTransactionInProgress() &&
        !si.isClosed() &&
         si.isConnected() && 
         si.getJdbcCoordinator().getConnectionReleaseMode().equals(ConnectionReleaseMode.AFTER_TRANSACTION)){

        si.getJdbcCoordinator().getLogicalConnection().afterTransaction();
    }
}

It's working for all our tests, but if there are any drawbacks, I really don't know...

这篇关于休眠5:延迟加载后,数据库连接仍未释放(事务中为空闲)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆