Caused by: org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!
先贴一张错误图
要解决该问题首先我们要明确一件事,那就是Hibernate openSession() 和 getCurrentSession的区别
具体区别如下
getHiberanteTemplate 、getCurrentSession和OpenSession
采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。
采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:
如果是本地事物,及JDBC一个数据库:
thread
如果是全局事物,及jta事物、多个数据库资源或事物资源:
jta
使用spring的getHiberanteTemplate 就不需要考虑事务管理和session关闭的问题:
openSession创建session时autoCloseSessionEnabled参数为false,即在事物结束后不会自动关闭session,需要手动关闭,如果不关闭将导致session关联的数据库连接无法释放,最后资源耗尽而使程序当掉。注意:这一句话就是我们连接池爆满的原因
getCurrentSession创建session时autoCloseSessionEnabled,flushBeforeCompletionEnabled都为true,并且session会同sessionFactory组成一个map以sessionFactory为主键绑定到当前线程。
getCurrentSession():从上下文(配置文件current_session_context_class: thread 使用Connection自动管理;jta(java transaction api) 由Application Server提供的分布式事务管理,Tomcat本身不具备此能力,JBoss、WebLogic具备)找,如果有,则用旧的,否则创建新的,事务提交自动Close;
getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置:
如果使用的是本地事务(jdbc事务)
thread
如果使用的是全局事务(jta事务)
jta
总之:
getCurrentSession () 使用当前的session
openSession() 重新建立一个新的session
在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。
最后!!!!综上所述!!!!!!
导致我们连接池爆满的原因就是我们采用了openSession()来获取session对象,并且在用完后没有关闭我们的session对象,所以解决办法有三种
1.在执行完相应的业务后调用session.close()方法关闭该session对象
2.使用getCurrentSession()替换OpenSession()来获取session
3.使用spring的getHiberanteTemplate来获取session
附图: