前段时间做的一个应用hibernate的项目,在进行压力测试的时候发现,程序运行一段时间数据库连接就会爆满。检查程序,发现一个可疑代码,那就是使用session 打开一个connection,使用完毕之后,调用只关闭了session,但是没有关闭connection。代码如下:
在执行完业务逻辑之后,没有对打开的connection进行关闭就退出了(session的关闭在模板类RollbackTrans中完成)。现在的疑问是,只关闭session,即调用session.close()会一起关闭connection吗?带着这个疑问,我查看了源代码,写代码实际运行测试,下面是解决疑问的过程:
1、查看源代码:
session.close代码部分,代码是在org.hibernate.impl.SessionImpl中实现的
这个close做了几个事情:
1、检查是否已经关闭
2、检查是否打开统计配置,如果是的话就进行关闭统计(hibernate中有一个配置项,用于监控sessionFactory的连接情况hibernate.generate_statistics)
3、关闭所有子session
4、这点关键,与本文章讨论的问题关系很大。那就是调用jdbcContext.getConnectionManager().close()。从这行代码来看,我的猜测是:session.close应该是会关闭有它打开(session.connection())的connection。接下来我们来研究这个close方法(jdbcContext.getConnectionManager().close),看下面代码