探讨Spring与Hibernate的整合所遇到的管理Session的问题

Spring和Hibernate整合事务配置之current_session_context_class hibernate.current_session_context_class设置 原来配置事务模式: thread 会出现不存在激活的事务现象,主要原因是由于咋Spring管理事务中current session是绑定下springsessioncontext中的,而不是绑定在threadlocalsessioncontext中的。 hibernate.current_session_c 阅读详情

http://topic.youkuaiyun.com/u/20080704/14/bb2751bf-cd0a-4025-9e66-18f9031b1361.html

 

最近使用Struts1.3+Spring2.0+Hibernate3.2做了一个项目,最后测试时发现一个致命的错误,我的项目运行一段时间后,数据库直接down掉了。hibernate报了以下异常:

Java code
   
2008 - 06 - 30 19 : 00 : 02 , 250 WARN [com.mchange.v2.resourcepool.BasicResourcePool] - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@b27de5 -- Acquisition Attempt Failed !!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts ( 30 ). 2008 - 06 - 30 19 : 00 : 02 , 312 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0 , SQLState: null 2008 - 06 - 30 19 : 00 : 02 , 312 ERROR [org.hibernate.util.JDBCExceptionReporter] - Connections could not be acquired from the underlying database ! 2008 - 06 - 30 19 : 00 : 02 , 328 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0 , SQLState: null 2008 - 06 - 30 19 : 00 : 02 , 328 ERROR [org.hibernate.util.JDBCExceptionReporter] - Connections could not be acquired from the underlying database ! org.hibernate.exception.GenericJDBCException: Cannot open connection at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java: 103 ) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java: 91 ) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java: 43 ) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java: 29 ) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java: 420 ) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java: 144 ) at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java: 105 ) at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java: 1561 ) at org.hibernate.loader.Loader.doQuery(Loader.java: 661 ) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java: 224 ) at org.hibernate.loader.Loader.doList(Loader.java: 2145 ) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java: 2029 ) at org.hibernate.loader.Loader.list(Loader.java: 2024 ) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java: 375 ) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java: 308 ) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java: 153 ) at org.hibernate.impl.SessionImpl.list(SessionImpl.java: 1106 ) at org.hibernate.impl.QueryImpl.list(QueryImpl.java: 79 ) at cn.gcy.cyzd.impl.ItemDAOImpl.queryAll(ItemDAOImpl.java: 15 ) at cn.gcy.cyzd.struts.action.IndexAction.list(IndexAction.java: 54 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java: 269 ) at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java: 170 ) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java: 425 ) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java: 228 ) at org.apache.struts.action.ActionServlet.process(ActionServlet.java: 1913 ) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java: 449 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 690 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java: 803 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 290 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206 ) at cn.gcy.cyzd.filter.EncodingFilter.doFilter(EncodingFilter.java: 22 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 235 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206 ) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java: 198 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 75 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 235 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206 ) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233 ) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175 ) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128 ) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102 ) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 109 ) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 286 ) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java: 856 ) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java: 565 ) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java: 1509 ) at java.lang.Thread.run(Unknown Source) Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database ! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java: 104 ) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java: 236 ) at com.mchange.v2.c3p0.PoolBackedDataSource.getConnection(PoolBackedDataSource.java: 94 ) at com.mchange.v2.c3p0.ComboPooledDataSource.getConnection(ComboPooledDataSource.java: 521 ) at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java: 81 ) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java: 417 ) ... 46 more Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAcquire(BasicResourcePool.java: 970 ) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java: 208 ) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java: 232 ) ... 50 more 2008 - 06 - 30 19 : 00 : 05 , 093 WARN [com.mchange.v2.resourcepool.BasicResourcePool] - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4c03d4 -- Acquisition Attempt Failed !!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts ( 30 ).


这个错误郁闷了我很久,通过大家的帮助还有网络的大量资源我终于找到了其中的原因。首先说说我的daoimpl的写法
在daoimpl中我使用
Java code
   
Query q = super .getSession().createQuery(hql);

语句可以正常执行,但是在多次使用该语句后数据库有很多连接仍然没有断开!这是导致异常的关键所在,spring不是管理了session吗?这是为什么呢?
通过继承HibernateDaoSupport我们有两个选择:
 
Java code
   
getSession().createQuery( " from Users " ); getHibernateTemplate().find( " FROM Users);


网上找了找资料都是推荐用getHibernateTemplate,原因说的不是很清楚。

于是我做了如下测试:

分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users);
1000次
结果getSession()很快就包无法建立连接了。而getHibernateTemplate屁事没有可以跑完。

通过后台观察,使用getSession会在数据库中留下很多SQL*Net message from client的连接,终止测试后连接自动释放。
而getHibernateTemplate则从头到尾都使用一个连接。

难道是getSession()不会自动释放连接?

于是我又分别循环调用getSession().createQuery("from Users");getHibernateTemplate().find( "FROM Users);
5次
发现当前端程序一结束,getSession的5个连接立刻就释放了。结合前面1000次时终止测试后连接自动释放,可以说明getSession()是会自动释放连接的。

结论:
1、getSession()和getHibernateTemplate都可以自动释放连接(当然你的配置要正确),但是在一个线程内getSession会get很多个session(就是开很多个会话、连接),很可能导致数据库连接超过上限。所以推荐使用getHibernateTemplate。

2、如果有些语句无法用getHibernateTemplate实现,可以使用getHibernateTemplate.execute使用HibernateCallback回调接口。

 

另:可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这样也可以,就是麻烦点。
参见:
http://springframework.org/docs/api/org/springframework/orm/hibernate3/HibernateTemplate.html
http://www.mxjava.com/blog/article.asp?id=246
参考资料:http://blog.sina.com.cn/s/blog_50e4caf70100a1nx.html

于是,如果我们一定要书写hql语句可以参考如下形式

Java code
   
public PageUtil getLog( final Long userid, final Integer page) { String counthql = " select count(mod) from Blog mod where mod.userinfo.userid=? " ; Integer count = (Integer)getHibernateTemplate().find(counthql, userid).get( 0 ); final PageUtil pu = new PageUtil(); // 分页包装类 pu.setCount(count); pu.setPage(page); pu.setMaxPagesbyCount(count); List li = getHibernateTemplate().executeFind( new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { String hql = " from Blog mod left join fetch mod.userinfo where mod.userinfo.userid=? order by mod.logid desc " ; Query query = session.createQuery(hql); query.setParameter( 0 , userid); query.setMaxResults(pu.getMaxResults()); query.setFirstResult(pu.getFirstResult()); return query.list(); } }); pu.setResults(li); return pu ; }



只有这样做了以后才能确保数据库的连接能够尽早被释放,项目不至于崩溃。

 

____________________________________________________

 

解决办法1 this.releaseSession(session);
解决办法2 hibernate.connection.release_mode=auto
解决办法3 getSession(false);

不妨可以再测试一下

____________________________________________________

阿里云人工智能工程师ACA认证免费课程学习笔记 阅读详情

相关推荐

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 301

Spring 集成hibernate时配置连接释放模式

http://zmfkplj.iteye.com/blog/220822 程序出现一个奇怪的现象,用Quartz作业调度启动任务,运行一段时间后,任务会卡在一个查询接口处,久久不能运行完毕。 我本能的发现是不是数据库连接池数量不够? 于是我加带了连接池的大小。但是,问题依然出现。 这时,我就只能使用debug+log来调试了。调试后发现,当发生查询接口执行卡住现象时,程序连接池的确是不...

weixin_33835690的博客 783

氮化镓GaN电机驱动实战:从器件原理到EPC驱动中心

电机驱动是工业自动化和电动交通的核心,功率器件的选择直接决定系统效率与可靠性。传统硅基IGBT和MOSFET在开关速度、损耗方面存在瓶颈,而氮化镓(GaN)作为宽禁带半导体,凭借高电子迁移率、低栅极电荷和近乎为零的反向恢复电荷,正成为电机驱动领域的热门选择。EPC建立电机驱动中心,提供完整的评估平台,覆盖从低压家电到中压伺服的应用场景。文章从GaN器件原理出发,对比传统硅器件,详解三相BLDC/PMSM驱动系统的搭建、栅极驱动与Layout设计、死区时间设置及参数计算实例,并分享测试中遇到的振铃、EMI等高

weixin_29168675的博客 323

Hibernate错误记录

一、错误信息 could not initialize proxy - no Session——翻译为无法初始化没有会话的代理对象 二、原因 出现该错误的原因是Hibernate使用sessionFactory来管理session,我们每进行一次数据库操作时都会新建一个session对象,当我们操作完成后,hibernate就会在dao层立即关闭该session。所以当我们操作类中另...

shaonianbz的博客 402

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

提取abaqus中节点集合的应力应变

节点是没有应力应变的,只有积分点才有,所以直接在odb文件里面用FieldOutput是整不出来的(结果是个空列表),只能用session这种让abaqus自己帮你处理。具体的代码需要根据自己操作的时候abaqus.rpy这个文件中代码的变化来更改。

蓝胖子的博客 4553

hibernate错误:org.hibernate.SessionException: Session was already closed

org.hibernate.SessionException: Session was already closed 在使用

春暖花开的专栏 677

Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析

本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。

weixin_29206669的博客 1356

解决Hibernate的Session的关闭与开启问题

当在使用Hibernate做开发的时候出现org.hibernate.LazyInitializationException: could not initialize proxy - no Session错误提示病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session)关闭后使用该对象的未加载变量,也就是说session已经关

muyu114的专栏 5705

ADS 2024实战:手把手教你搞定CGH40010F的Doherty功放仿真与版图(附避坑指南)

本文详细介绍了使用ADS 2024进行CGH40010F Doherty功放从仿真到版图的全流程设计,涵盖器件建模、稳定性分析、负载牵引匹配和版图联合仿真等关键步骤。特别针对新手常见问题提供避坑指南,帮助工程师高效完成射频功放设计,提升5G基站和雷达系统的性能。

weixin_42528191的博客 221

手把手教您如何群晖/飞牛NAS等服务器上一键部署洛雪音乐同步服务,手机电脑无缝同步歌单,支持外网访问

🎵 手机电脑歌单不同步?用Docker在群晖/飞牛NAS等服务器上搭个同步服务器, 3分钟搞定 !支持docker-compose一键部署,手机、电脑、平板收藏夹实时同步,外出也能用域名远程访问 ~ ✨

XiaoqiangClub的博客 4608

SessionFactory create failed (Spring+Hibernate)

最近一个项目中用到了Spring+Hibernate, 用的MyEclipse的Project Capabilities功能来管理spring和hibernate的类库的. 数据库, sessionFactory, transactionManager都配置好之后, 运行dao test case始终报错, 提示sessionFactory创建错误. 想到原来在论坛上别人也问过

BRUNI (不如你) 's 优快云 BLOG 1110

203.华为组网实例:VLAN间互通DHCP中继实验

SW核心交换机上配置DHCP中继。

迷逝 8432

hibernate中NoSession问题

在Spring整合hibernate的环境中,由于hibernate将所有全权交给了Spring管理,所以Session的开启与关闭也有Spring管理 Spring会开启Session的几种情况 1、在web.xml中配置了OpenSessionInViewFilter,当有访问经过filter时,session会被开启。 2、在事务环境中,session会被开启所以发生NoSession的

xyllp的博客 1899

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring Session 2 整合 Spring 5 与 Redis 的实践经验分享

本文分享了在Spring 5开发Web应用时,使用Spring Session 2 + Redis解决分布式会话共享问题的经验。文章介绍了传统HttpSession的局限性,详细说明了项目结构、技术栈(包括Redis和Hibernate 5的整合)、Maven依赖配置和Redis设置。作者还总结了实践中的常见问题(如Session不生效、提前过期等)及解决方案,验证了Redis托管Session的成功实现。通过将用户数据(Hibernate管理)和用户状态(Redis管理)分层解耦,有效解决了集群环境下会话

聚焦学生开发者需求,分享课设毕设项目实战经验、系统开发技巧、数据库设计规范及文档排版实用方法。 1243

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

spring整合hibernate关于session的管理

spring整合hibernate关于session的管理<br />关键字: spring session <br />最近在测试oa系统的时候,发现若连接几次数据库后,tomcat就完全没反应,打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常。在网上找到了问题及解决方法如下:<br />在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + H

dingqinghu的专栏 1052

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

<property name="current_session_context_class">thread</property> 属性

转载至:http://www.cnblogs.com/a757956132/p/4309364.html thread这个属性的作用:这样配置是本地jdbc事务配置,你通过getCurrentSession创建的session会绑定到当前线程 平时在单独使用hibernate的时候,习惯于配置属性 thread 根据文档,这个是hibernate3.1以后的

云舒编程的博客 1476

current_session_context_class

平时在单独使用hibernate的时候,习惯于配置属性 thread 根据文档,这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话. 后来当我们把spring,hibernate整合的时候,在spri

似水无痕的专栏 1320

current_session_context_class的设置和声明式事务管理出错

平时在单独使用hibernate的时候,习惯于配置属性 thread 根据文档,这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话. 后来当我们把spring,hibernate整合的时候,在spri

坚持自己! 781

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

可能原因:Hibernate的OpenSessionInViewFilter放在了Struts的StrutsPrepareAndExecuteFilter后面 解决方法:挪到前面即可。 openSessionInViewFilter org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

Olizee的专栏 926

Spring @Transactional 声明式事务管理 getCurrentSession

转载于:http://blog.youkuaiyun.com/irelandken/article/details/7193123 Spring @Transactional声明式事务管理  getCurrentSession   在Spring @Transactional声明式事务管理的配置中,hibernate.current_session_context_class=threa

山巅 1140

hibernate4+spring3.1整合常见问题解决方法

由于目前网上很少有关于hibernate4+spring3.1的配置方法,为了让大家少走弯路,我总结了一下与大家分享。 hibernate4的改动较大只有spring3.1以上版本能够支持。这里简单介绍了hibernate4相对于hibernate3配置时出现的错误,只列举了问题和解决方法,详细原理如果大家感兴趣还是去自己搜吧,网上很多。 1、spring3.1去掉了Hibernate

wolongsuxing的专栏 426

Hibernate整合进spring--使用hibernateTemplate.getSessionFactory().getCurrentSession()理解

1 单独使用hibernate处理事务 本来只用hibernate开发,从而可以省了DAO层实现数据库访问和跨数据库,也可以对代码进行更好的封装,当我们web中单独使用hibernate时,我们需要单独的处理hibernate的事务,我是使用filter来对事务进行控制的: 单独使用hibernate使用filter进行事务控制: HibernateSessionFilter.ja...

weixin_30820151的博客 78

Spring 总结04

Spring 总结04 2011年07月01日   Ssh整合Spring2.5+Hibernate3.3+Struts1.3整合开发   hibernate核心安装包下的:   hibernate3.jar   lib\required\*.jar   lib\optional\ehcache-1.2.3.jar   hibernate注解安装包下的   lib...

air18air 142
上一篇: dwr push技术学习
下一篇: jvm
sukyle
博客等级 码龄18年 41粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值