Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
2011-12-06 14:33
471 查看
在 Spring+Hibernate的集成环境里,如果DAO直接使用HibernateDaoSupport的getSession()方法获取 session进行数据操作而没有显式地关闭该session,那么程序表现为:每个session会打开一个connection,并且
connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.
需要注意的是:在Spring环境里,即使我们使用Hibernate原生的API,比如这里所说的使用HibernateDaoSupport的getSession()方法得到Session进行数据操作(而不是使用Spring自己提供的API,比如HibernateTemplate),这些操作也依然会被纳入spring管理的事务中去.原因是通过getSession()方法得到Session是一个绑定到当前事务上的session.此处可参考:http://www.javaeye.com/topic/110801.这就是为什么Spring文档中提到的:You
can implement DAOs based on the plain Hibernate 3 API, while still being able to participate in Spring-managed transactions.
如果程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor那将是另外一种情形了.
简单总结: HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭. HibernateTemplate除能参与到 Spring管理的事务中,还 能够确保Session实例的正确打开和关闭.
connection会一直保持(因为没有显式地close).如果程序使用了c3p0连接池,则因为c3p0连接池默认最大连接数是15,程序会表现为当打开第15个连接时,程序处于停滞状态,等待从连接池获取新的连接.
在同样条件下,使用HibernateTemplate进行数据操作,就没有连接数持续增长的情况,程序结束时连接数归零.这印证了spring文档上所说:HibernateTemplate会对session进行了管理,能够确保Session实例的正确打开和关闭.
需要注意的是:在Spring环境里,即使我们使用Hibernate原生的API,比如这里所说的使用HibernateDaoSupport的getSession()方法得到Session进行数据操作(而不是使用Spring自己提供的API,比如HibernateTemplate),这些操作也依然会被纳入spring管理的事务中去.原因是通过getSession()方法得到Session是一个绑定到当前事务上的session.此处可参考:http://www.javaeye.com/topic/110801.这就是为什么Spring文档中提到的:You
can implement DAOs based on the plain Hibernate 3 API, while still being able to participate in Spring-managed transactions.
如果程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor那将是另外一种情形了.
简单总结: HibernateDaoSupport的getSession()得到的Session会参与Spring管理的事务中,但是不能自动的关闭. HibernateTemplate除能参与到 Spring管理的事务中,还 能够确保Session实例的正确打开和关闭.
相关文章推荐
- Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
- Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
- Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
- Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
- 通过Spring使用JPA进行数据访问
- Spring使用JdbcTemplate操作数据库---使用RowMapperResultSetExtractor读数据篇
- 通过闭包对一个数据 x 做“流水线操作”,三层闭包,每一层依次进行一项操作(先求绝对值,再开方,再求相反数)
- 一个使用GridView显示数据,并且可以进行添加、修改、删除操作的例子
- 使用MATLAB对数据进行位操作以及RGB图片显示
- 通过insert型触发器对员工数据进行添加操作
- 使用黑莓8900通过蓝牙连接华为交换机进行现场网络配置与操作(一)
- 使用iServer JAVA API访问iServer数据服务进行数据操作示例
- 对象文件[置顶] 如何在 ASM 存储中使用 Data Pump (expdp impdp)进行数据导出导入操作
- Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 1)
- ASP.Net中通过Jquery前端对Repeater控件绑定的数据进行操作
- 【ERP系统设计】【数据模块】3 使用Eclipse插件DB viewer进行MySQL数据库操作 .
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- 在vuex的store中如何正确的通过axios进行请求操作获取数据
- springboot框架中使用java操作kafka获取数据