`
langgufu
  • 浏览: 2309217 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernateTemplate session关闭

 
阅读更多

1.虽然继承了HibernateDaoSupport这个类,但是this.getSession(),获得的session也要在使用后即使关闭,因为这个session是原生的session不是经过sping代理过的,并且还没有事物管理,自动提交,自动关闭连接等功能,所以使用使用getSession()获得session时一定要关闭。

2.使用getHibernateTemplate()中的1.exceute(callback) 2. executeFind(callback) 3.execute(callback, boolean)时一定要注意:1和2会点方法中使用的session都是经过spring代理过的会自动关闭,但是3最后一个参数标示的是:回调函数中使用的session是否是本地的(没有经过是spring代理过,没有自动关闭连接的功能)。true:本地的 false:spring代理过的(不用但是session是否关闭)

3.spring的bean的默认管理都是单列模式,在ssh整合中保证各dao的的实例是无状态的,佛则在一旦有某个方法设置状态之后,别的方法也就有了状态,但是别的方法又不需要这个状态,或者对别的放产生了别的不好的影响:例如

getHibernateTemplate().setMaxResults(3);

一旦是给HibernateTemplate设置了最大输出记录数,那么以后调用这个类中的别的方法的最大记录数也就是3个,对别人调用这个类的别的方法产生的副作用,除非你再次设置你想要的最大记录数,setMaxResults(10);

4,都说Spring 和 Hibernate是绝配。今天有点小小心得,拿出来共享一下。 当我们费了九牛二虎之力终于把环境全配好之后,有一个问题摆在面前: 如何访问数据库? 通过继承HibernateDaoSupport我们有两个选择: 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 请各位高手不吝赐教。 另:用myEclipse自动生成的HibernateDAO代码中。4.1.1版本的myEclipse自动生成的findById方法使用的是 getSession方法获得连接, 不过在6.0中已经修改为使用getHibernateTemplate方法。5.0的没有测试。 getSessionFactory().getCurrentSession()

分享到:
评论

相关推荐

    HibernateTemplate汇总

    closeIterator 方法用于立即关闭由 iterate 方法创建的 Iterator 对象。 contains 方法 contains 方法用于检查给定的对象是否在 Session 缓存中。 createSessionProxy 方法 createSessionProxy 方法用于创建一个...

    hibernateTemplate的常用方法

    通过`HibernateTemplate`,开发者可以非常方便地进行数据的增删改查等基本操作,而无需关心Hibernate Session的开启、关闭及事务管理等问题。本文将详细介绍`HibernateTemplate`的一些常用方法及其应用场景。 #### ...

    HibernateTemplate的用法总结

    - **统一的异常处理**:使用HibernateTemplate可以避免出现由Session关闭不当导致的问题。 - **集成Spring框架**:与Spring框架高度集成,可以方便地管理事务。 - **易于测试**:由于使用了Spring的依赖注入,使得...

    关于使用HibernateTemplate

    而在使用`HibernateTemplate`时,这些操作都被自动管理,从而避免了因遗漏关闭`Session`而导致的资源泄露问题。 3. **异常处理**:当使用`HibernateTemplate`执行数据库操作时,它会自动捕获并处理Hibernate抛出的...

    HibernateTemplate类的使用

    该方法首先检查`Session`是否已经关闭,然后获取当前`Session`的`Transaction`对象,并调用其`begin`方法。 2. **`getTransaction()`** 方法用于获取当前`Session`的`Transaction`对象。如果该对象尚未初始化,则...

    对hibernate的封装 HibernateTemplate

    无需手动开启和关闭Session,也不用关心事务的回滚和提交。 2. **异常转换**:它将Hibernate的异常转换为Spring的DataAccessException,这样整个应用程序可以有一致的异常处理策略,而不用处理多种不同来源的异常。...

    JAVA的hibernate手动获取session的方法

    在实际开发中,为了更好地管理Session和事务,我们通常会使用DAO(数据访问对象)模式,或者Spring的HibernateTemplate或JPA的EntityManager。这些高级工具可以自动化处理事务管理和Session生命周期,减少出错的可能...

    HibernateTemplate原理代码-模版设计模式

    `MyHibernateTemplate`类是整个机制的核心部分,它负责处理与数据库会话相关的所有事务管理,包括开启和关闭会话、事务提交或回滚等。具体来看: 1. **执行数据库操作**:`executeWithNativeSession`方法接收一个...

    hibernate session生命周期示例

    在实际应用中,通常推荐使用Transaction模板或者Spring的HibernateTemplate或JpaTemplate,它们可以帮助你更好地管理Session和事务。例如,Spring的`@Transactional`注解可以自动管理事务的生命周期,使得代码更加...

    Spring与Hibernate集成中的session

    当Spring与Hibernate集成时,Spring通过其`HibernateTemplate`或`HibernateSessionManager`等类来管理和协调Hibernate的`Session`。`Session`是Hibernate的核心概念,它是与数据库交互的主要接口,用于保存、更新和...

    第24次课-1 Spring与Hibernate的整合

    它只要获得SessionFactory的引用,就可以智能地打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate完成。 24.3 Spring对Hibernate的简化 24.3.2 简化的...

    Spring整合hibernate

    在事务开始时打开Session,在事务结束时关闭或回滚Session。虽然比前两种方式更底层,但提供了更大的灵活性和控制权。 在实际应用中,选择哪种方式取决于项目的需求和团队的偏好。对于新项目,通常推荐使用...

    hibernate API

    相比之下,直接使用`Session`进行操作更为直接,但需要手动处理Session的生命周期,比如开启、关闭Session以及异常处理。 在代码示例中,有一个批量更新的例子: ```java public void batchUpdate(Object[] params)...

    hql批量删除

    最后关闭Session来结束操作。需要注意的是,执行完此操作后,与被删除对象关联的Session中的实例将变为脱管状态。 批量插入数据: HQL同样支持批量插入数据的操作。在Hibernate中,批量插入的HQL语法与标准的SQL...

    HibernateDaoSupport的使用

    通过`getHibernateTemplate()`方法,我们可以获取到一个预配置好的HibernateTemplate对象,它会自动处理Session的打开、关闭和事务提交/回滚。 3. HibernateTemplate的使用:HibernateTemplate是Spring提供的一个...

    我的智囊团(SSH)01--07学习笔记

    `HibernateTemplate`是Spring对Hibernate ORM框架的一个封装,它提供了一组方便的方法,使得在处理数据库操作时无需直接与`Session`对象交互。这些方法包括对实体的增删改查(CRUD)操作,以及支持命名查询和分页...

    Spring延迟加载和声明式事务处理最终解决方案(修正版)

    Spring框架的延迟加载和声明式事务处理是两个关键特性,...通过合理地使用Open Session in View机制,可以解决延迟加载时Session关闭导致的问题,同时,声明式事务处理则简化了事务管理,提升了应用的效率和可扩展性。

    HIBERNATE4开发文档,HIBERNATE4的变化

    - 在使用`getCurrentSession()`时,事务会在请求结束时自动关闭,这可能导致在JSP页面中查询数据时session已关闭。为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开...

    Spring持久化模板总结

    子类通过getSessionFactory()获取SessionFactory,然后创建Session实例进行操作,降低了与Hibernate的直接耦合。 总的来说,JdbcTemplate适合简单的SQL操作,而HibernateTemplate适用于更复杂的对象关系映射场景。...

Global site tag (gtag.js) - Google Analytics