您的位置:首页 > 数据库

SSH下执行原生SQL造成session不能被关闭

2013-04-11 15:27 141 查看
由于hibernate的getHibernateTemplate()只能支持HQL查询,所以在通过原生SQL进行查询的时候需要进行其他方式,所以就可能造成在执行原生SQL的时候某些情况下spring并不能对session进行管理,所以就会出现不显示关闭session的情况下,连接池溢出!

项目中使用了proxool数据库连接池

1,通过getHibernateTemplate()的execute方法进行回调函数的执行原生SQL

代码示例:

 List resultList = (List)this.getHibernateTemplate().execute(

new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException, SQLException {

Query queryObject = session.createSQLQuery(querySqlString);


if (params != null) {

for (int i = 0; i < params.length; i++) {

queryObject.setParameter(i, params[i]);

}

}

return queryObject.list();

}

});


 

  结论:由于getHibernateTemplate()是通过spring来管理的,所以通过getHibernateTemplate()的方法在执行完操作之后会由spring自动释放连接资源



2,通过getSession()返回的createSQLQuery方法进行原生SQL查询

代码示例:[b]List resultList =[/b]getSession().createSQLQuery(sql);



结论:由于spring一般并不会对getSession()获取的对象进行活动管理,这相当于直接在底层的connection进行的SQL操作,只是不需要手动commit而已,但连接对象并不会得到释放,循环的执行瞬间将会把连接池所有连接耗尽。

解决方案:如果实在需要使用第二种方法,但又不愿意手动释放连接,则可以在当前方法所在的DAO的调用方service加上事物管理,由事物在方法结束后自动提交数据和释放连接对象!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: