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加上事物管理,由事物在方法结束后自动提交数据和释放连接对象!!!
项目中使用了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加上事物管理,由事物在方法结束后自动提交数据和释放连接对象!!!
相关文章推荐
- hibernate 使用原生sql不能执行删除!
- 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()
- 关于play框架中要对自己执行原生的sql不能得到page的解决方法。
- SSH客户端执行SQL命令时不能一次全部执行
- 在SSH2开发平台下利用Hibernate Session对象执行原生Sql语句
- 在ABP中通过EF直接执行原生Sql的解决方案
- hibernate执行插入时候报错SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'T_WY_KFUSER' 中的标识列插入显式值
- django执行原生sql
- SSH 框架中 service 里面有 sql 和 对象存储,执行顺序问题 Spring 事务提交顺序
- 使用sqltrace跟踪session执行的sql
- django中的connection.cursor执行原生sql
- Hibernate直接执行原生SQL
- PL/SQL DEVELOPER 软件不能执行的命令
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC FREESESSIONCACHE刷新针对 Microsoft SQL Server 实例执行的分布式查询所使用的分
- Yii2 SqlDataProvider 原生sql 执行sql
- Spring的jdbcTemplate查询执行原生sql
- sqlplus不能初始化以及sqlplus自动关闭的问题
- mybaits让人抓狂的错误!明明sql语句在navicat中执行没问题,但就是不能映射pojo实体类!
- 如何在IE窗体关闭之前执行一个操作,使Session消失
- 在定时任务中慎用pause,否则造成弹窗没关闭,下一次任务不会成功执行