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

什么时候需要对hibernate的session进行flush和clear?

阅读更多
    最近遇到了一个问题,在一个项目代码中有一个比较大的事务,事务内部是两重循环,在最内层通过getHibernateTemplate().save()进行数据保存,每当跑这段程序的时候,weblogic内存占用都会接近一个G,而且内存会不断增加,最后导致内存溢出错误。

    最后查找其原因,是由于session中的持久对象越来越多,最后达到数万数十万个,导致了内存溢出。

    解决方法是,在save后面添加了一段代码,使用spring回调函数调用doInHibernate(Session session),在里面对session进行flush()和clear(),这样保证session中的对象不会过多就ok了。


    大家有相关的问题欢迎讨论分享啊~
分享到:
评论
2 楼 springcold 2011-02-17  
是的,只是进行了getHibernateTemplate().save(),整个二重循环才是一个大事务,需要等所有都保存后才进行提交,所以就要自己去flush了
1 楼 shryan_bin 2011-01-17  
你的事务没提交吗?事务提交的时候,hibernate会去自动的flush,清楚缓存的。

相关推荐

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    在Java的Hibernate框架中,一级缓存是Session对象内置的缓存机制,它的存在是为了优化数据库操作,减少对数据库的直接访问,从而提高应用程序的性能。一级缓存的生命周期与Session对象相同,也就是说,只要Session...

    hibernate session详细方法,值得珍藏

    - **`clear()`**:清除Session中的所有缓存实体,这对于释放内存资源和避免脏读非常有用。 - **`flush()`**:强制Hibernate将所有未完成的数据库操作同步到数据库,这是在事务结束前通常需要执行的操作。 - **`...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...

    hibernate中evict()和clear()的区别.docx

    总的来说,`evict()`和`clear()`都是用于管理Hibernate Session缓存的方法,但它们处理的对象范围和时机不同。理解这两个方法的差异,可以帮助我们更有效地控制对象的状态,避免潜在的运行时异常,并提高应用程序的...

    Hibernate下数据批量处理解决方案

    在代码中,我们需要在适当的时候调用`flush()`和`clear()`方法,强制将缓存中的对象写入数据库并清空缓存,从而释放内存。例如: ```java Session session = sessionFactory.openSession(); Transaction tx = ...

    Hibernate三种状态区分

    - 当 Session 调用 `close()`、`clear()` 或 `evict()` 方法时,持久态对象会变成脱管态(Detached)。 3. **脱管态(Detached)**: - 脱管态对象是已经与 Session 断开连接的持久态对象,但仍然持有数据库的标识...

    深入理解Hibernate中的flush机制

    - `session.createSQLQuery(sql).uniqueResult()`能直接查询到数据,是因为Hibernate在执行查询前会先flush,所以即使事务未提交,查询也是基于已flush的数据进行的,相当于查看了缓存中的状态。 4. **缓存与查询*...

    hibernate基础教程

    3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate...

    Hibernate管理Session和批量操作分析

    但需要注意,频繁调用可能导致内存压力,因此建议在适当的时候调用`flush()`和`clear()`。 2. **通过HQL(Hibernate Query Language)**:利用HQL语句实现批量操作,比如更新或删除,可以避免加载整个对象到内存。 ...

    Hibernate中大量数据的更新

    因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个INSERT 语句合并成一个批量插入语句,从而提高性能。在 Hibernate 配置...

    Hibernate面试问题大全

    【Hibernate面试问题详解】 1. 什么是ORM? ORM(Object-Relational Mapping)是一种技术,它将Java应用程序中的对象自动持久化到关系数据库的表中...熟悉这些知识点对于理解和使用Hibernate进行数据库操作至关重要。

    2022年Hibernate下数据批量处理Java教程.docx

    我们可以设置一个合理的 JDBC 批处理大小,例如 hibernate.jdbc.batch_size 20,然后在一定间隔对 Session 进行 flush() 和 clear()。这样可以避免内存溢出错误,并提高性能。 在批量插入数据时,我们可以使用以下...

    Hibernate批量处理

    // 每20条记录进行一次flush和clear if ((i + 1) % 20 == 0) { session.flush(); session.clear(); } } tx.commit(); session.close(); ``` ##### 2. 其他批量处理方式 除了通过Session进行批量处理外,还...

    基于hibernate的baseDao

    例如,可以使用Spring的`@Transactional`注解进行事务管理,使用Hibernate的二级缓存提高性能,或者通过`Session.flush()`和`Session.clear()`方法控制session的状态。 6. **集成测试** 在实际项目中,BaseDAO应...

    Hibernate原理

    6. **Flush and Clear**:在Session结束前,Hibernate会将缓存中的脏数据(即已修改但未同步到数据库的数据)刷新到数据库,并清空缓存,确保数据的一致性。 7. **Session和SessionFactory关闭**:在应用程序结束或...

    Hibernate三种状态和Session常用的方法

    Hibernate三种状态和Session常用的方法 Hibernate 作为一个流行的 Java 持久层框架,提供了对数据库的操作能力,其中Session 是 Hibernate 中最核心的接口,负责管理对象的生命周期。为了更好地理解 Hibernate 的...

    jdbc_Hibernate总结

    `flush()`、`clear()`和`close()`方法分别用于清理缓存并执行SQL(但不提交)、清空缓存和回滚事务,以及清空缓存并提交事务。值得注意的是,`Session`中的缓存会存储所有被操作的对象,如`save`、`update`、`get`和...

    Hibernate官方中文参考手册下载

    批量操作如批处理更新和删除可以提高性能,例如`Session.flush()`和`Session.clear()`方法用于控制批处理的界限。 **12. 高级特性** 包括懒加载(Lazy Loading)、集合的分页查询、子查询、连接查询、联合查询、一...

    在Hibernate应用中处理批量更新和批量删除

    1. **使用`flush()`和`evict()`方法**:在修改实体后,主动调用`session.flush()`方法,使Hibernate将缓存中的变更同步到数据库,然后调用`session.evict(entity)`方法,从缓存中移除实体,这样下一次操作不会受到...

Global site tag (gtag.js) - Google Analytics