问题描述
struts2springframework3.1.0hibernate3在Dao里,调用this.getSession().createSQLQuery(sqlString);连接池不自动关闭,时间长了连接池就会满。而调用this.getSession().createQuery(sqlString);就不会出错,但是项目需要,有LEFTJOIN之类的SQL,不调用createSQLQuery不行。我尝试了在调用完后执行了this.getSession().close();this.getSession().clear();没有效果现在只能是靠设置Tomcat的连接池中的removeAbandonedTimeout=10来临时解决问题。但是只是治标不治本,当并发大的时候,还是会出错。求一完美解决方案。跪谢。
解决方案
本帖最后由 Drunkard_Faron 于 2014-11-13 15:23:18 编辑
解决方案二:
代码如下连接池会超时的代码:@SuppressWarnings("unchecked")@OverridepublicList<Object[]>getObjectList()throwsException{StringsqlString="";List<Object[]>list=null;try{sqlString+="SELECTa.id,"+"a.name,"+"a.card_type,"+"a.card_num,"+"a.sex,"+"a.birthday,"+"a.nation,"+"a.political,"+"a.center_id,"+"a.gradation_id,"+"a.specialty_id,"+"a.school_name,"+"a.phone,"+"a.qq,"+"a.province_id,"+"a.city_id,"+"a.district_id,"+"a.address,"+"a.update_datetime,"+"a.apply_user_id,"+"p1.namecard_type_name,"+"p2.namesex_name,"+"p3.namenation_name,"+"p4.namepolitical_name,"+"c.namecenter_name,"+"g.namegradation_name,"+"s.namespecialty_name,"+"pr.ProvinceName,"+"ci.CityName,"+"di.DistrictName";sqlString+="FROMapplya";sqlString+="LEFTJOINparameterp1ONp1.id=a.card_type";sqlString+="LEFTJOINparameterp2ONp2.id=a.sex";sqlString+="LEFTJOINparameterp3ONp3.id=a.nation";sqlString+="LEFTJOINparameterp4ONp4.id=a.political";sqlString+="LEFTJOINcentercONc.id=a.center_id";sqlString+="LEFTJOINgradationgONg.id=a.gradation_id";sqlString+="LEFTJOINspecialtysONs.id=a.specialty_id";sqlString+="LEFTJOINprovinceprONpr.ProvinceID=a.province_id";sqlString+="LEFTJOINcityciONci.CityID=a.city_id";sqlString+="LEFTJOINdistrictdiONdi.DistrictID=a.district_id";sqlString+="INNERJOIN("+"SELECTMAX(update_datetime)max_update_datetime,apply_user_id"+"FROMapplyGROUPBYapply_user_id"+")l_a";sqlString+="ONl_a.apply_user_id=a.apply_user_idANDl_a.max_update_datetime=a.update_datetime";sqlString+="ORDERBYa.apply_user_idDESC,a.update_datetimeDESC";list=this.getSession().createSQLQuery(sqlString).list();}catch(Exceptione){log.error(e);throwe;}returnlist;}
连接池不会超时的代码:@SuppressWarnings("unchecked")@OverridepublicList<Apply>getApplyListByApplyUserId(StringapplyUserId)throwsException{StringsqlString="FROMApplymWHEREm.applyUserId=?ORDERBYm.updateDatetimeDESC";List<Apply>list=newArrayList<Apply>();try{Queryquery=this.getSession().createQuery(sqlString);query.setString(0,applyUserId);list=query.list();}catch(Exceptione){log.error(e);throwe;}returnlist;}
解决方案三:
你是用Hibernate中用连接池的方式是吧、要是这样的、就应该在Tomcat中配置web.xml和context.xml连接池的、这个你配置好了吗?
解决方案四:
回复2楼,那个都配置了,跟Tomcat无关,是session没有关闭连接池。
解决方案五:
行了,自己解决了
解决方案六:
引用4楼Drunkard_Faron的回复:
行了,自己解决了
怎么解决的
解决方案七:
HQL好像也可以连接查询啊
解决方案八:
其实这种情况一般都用Profile工具跟踪一下就知道了;如果真的是连接未释放的问题,跟踪跟踪源代码就清楚了。
解决方案九:
首先,我认为createSQLQuery和createQuery的区别在于功能,和连接没有关系。前面可以跑sql,返回一个list,后者只能hql,返回对象list。其次,session是肯定可以释放的,一般大型项目都是通过配置最大最小连接和空闲连接时间来达到性能和连接数的平衡。