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

Hibernate 一级缓存的陷阱

    博客分类:
  • java
阅读更多

最近公司的应用经常报OOM,一开始我以为是公司业务数据太多,导致内存不够,所以只是简单的把容器的内存加大。撑了几天后这个错仍然被报出来。后来我仔细分析过项目代码后,没有发现有任何引起内存泄漏的地方。百思不得其解,于是我决定在OOM异常发生的那刻将JVM内存堆导出来仔细分析,我在生产环境的某一台机器上加上了JVM启动参数:“-XX:+HeapDumpOnOutOfMemoryError

    -XX:HeapDumpPath=/app/vas_platform/temp/” 然后等了一天,终于又报错了,拿出堆文件用“Eclipse Memory Analyzer”打开分析,发现占用内存的地方居然有75%来自org.hibernate.engine.StatefulPersistenceContext(靠,这不科学啊!)

后来查看各个StatefulPersistenceContext里面的内容发现里面保存存着多达几十万个实体对象,其中大部分都是比较大的对象(本身字段特别多而且还级联了许多其它的实体一级接着一级的级联),心想为什么会这样呢?一个请求过来->打开Session->处理完业务->关闭Session,没问题啊而且所有页面均没有卡死的现像,难道代码里面有占用Session没关的地方。于是仔细分析代码终于被我发现问题了。我们的应用会定时启动几个quartz任务来处理复杂且影响页面响应时间的业务,这部分业务的业务数据是从数据库查的,只有业务数据全都被处理完后这个quartz才会结束。

因为Hibernate的Session是带有一级缓存的,每个经由Session查出来的对象会填充至一级缓存,以避免多次的数据库仿问。当这几个quartz任务的业务数据较多的时候,就会有很多对象被填入一级缓存这样一来持久化上下文中保存的对象越来越多。最终导致OOM.

 

【留给自己】

  • 大小: 70 KB
7
2
分享到:
评论
18 楼 xsh5324 2013-10-19  
libofeng 写道
会不会是没有实现hashCode, equals方法导致的?

我想应该不会是这没有实现这俩方法导致的(我们的应用中确实存在部分实体没有实现这两方法),据我了解 Hibernate中区分一个实体在不在一级缓存或持久化上下文中是通过EntityKey来区分的,而EntityKey是通过实体的ID和EntityModel创建的,EntityKey中实现了用于区分实体的equals和hashCode方法,所以 我们的实体中没有实现equals,hashCode应该不会导致加载重复实体到一级缓存中。

不知道我有没有误解您的意思?
17 楼 libofeng 2013-10-19  
会不会是没有实现hashCode, equals方法导致的?
16 楼 xsh5324 2013-10-18  
damoqiongqiu 写道
然后你是怎么解决的呢?亲?

哎哟,大漠兄 才注意到你的留言真不好意思啊。我们目前还只是简单在quartz调度的业务代码中加上session.clear(),虽然有点不体面但能解决问题。不知道大漠兄有什么更好的办法来解决???
15 楼 xsh5324 2013-10-18  
nello 写道
看完之后,没 Hibernate 一级缓存什么事情,自己代码写的有问题。

确实是我们的代码写得有问题,没有考虑到周全.
14 楼 xsh5324 2013-10-18  
qiaojoy99 写道
xsh5324 写道
求求你帮帮我 写道
怎么解决的啊

当处理完50个后手动调用session.clear();但是如果在session.clear()之前有做过update(),delete();save();操作,必需先session.flush();

这个数目是用什么来监视的?

这只是打个比方.具体视业务精况而定.
13 楼 wm5920 2013-10-18  
不错啊。。。。。
12 楼 qiaojoy99 2013-10-18  
xsh5324 写道
求求你帮帮我 写道
怎么解决的啊

当处理完50个后手动调用session.clear();但是如果在session.clear()之前有做过update(),delete();save();操作,必需先session.flush();

这个数目是用什么来监视的?
11 楼 nello 2013-10-18  
session.evict(obj);
10 楼 nello 2013-10-18  
看完之后,没 Hibernate 一级缓存什么事情,自己代码写的有问题。
9 楼 xsh5324 2013-10-18  
求求你帮帮我 写道
怎么解决的啊

当处理完50个后手动调用session.clear();但是如果在session.clear()之前有做过update(),delete();save();操作,必需先session.flush();
8 楼 fanzexi 2013-10-18  
damoqiongqiu 写道
然后你是怎么解决的呢?亲?

作者说了最后一句话:【留给自己】
7 楼 damoqiongqiu 2013-10-18  
然后你是怎么解决的呢?亲?
6 楼 defuxiaozhu_84 2013-10-18  
mark下,可能会遇到缓存的陷阱。
5 楼 求求你帮帮我 2013-10-18  
怎么解决的啊
4 楼 hui_windows 2013-10-18  
mark,在查询大量实体时,hibernate一级缓存确实会有OOM风险
session.clear()和session.evict(obj); 可以清楚一级缓存中的对象
3 楼 winhell 2013-10-18  
问题找出来了就好办了。
可以在quartz中释放对象的一级缓存
2 楼 rentianchou 2013-10-18  
解决方案??
1 楼 1426717012 2013-10-18  
只说了问题,没有看到解决方案

相关推荐

    第一个手写Hibernate

    Hibernate提供了一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。一级缓存默认开启,自动管理对象状态。二级缓存可配置第三方缓存提供商,如EhCache,提高数据读取性能。 **八、注解使用** 除了XML...

    hibernate 3.6 中文 chm

    8. **缓存机制**:Hibernate提供了一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),能有效提高性能。同时,还支持第三方缓存服务如Ehcache。 9. **实体生命周期**:Hibernate管理对象的生命...

    hibernate教程打包下载,史上最全的HIBERNATE

    9. **第二级缓存**:Hibernate支持二级缓存,它可以提高应用程序性能,减少对数据库的访问。二级缓存分为提供商特定的区域和通用的查询缓存。 10. **性能优化**:教程可能涵盖如何优化Hibernate,例如批量操作、...

    CTSP Hibernate 培训教程

    同时,讲解了Hibernate的缓存机制,包括一级缓存和二级缓存,以及如何配置和使用第三方缓存系统,如EhCache和Redis,以提高应用性能。 第四部分:高级特性和最佳实践 最后,教程涵盖了Hibernate的高级特性,如懒...

    Hibernate5.0用户手册中文版.rar

    缓存可以提高数据访问速度,Hibernate提供了第一级缓存和第二级缓存两种级别的缓存策略。 在对象关系映射部分,手册会阐述Hibernate的注解机制,如@Entity、@Table、@Id、@GeneratedValue等,这些注解用于将Java类...

    hibernate5.0中文文档

    除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序的性能。Hibernate还支持JPA(Java Persistence API),因此,对于熟悉JPA的开发者,文档也会...

    Java Persistence with Hibernate, 2nd Edition

    包括第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及查询缓存的使用和配置。 7. **性能优化**:作者会分享如何优化Hibernate应用,包括延迟加载、批处理更新、预加载关联对象等策略,以提高...

    hibernate的flush机制

    Hibernate的持久化缓存机制是基于一级缓存(Session级别的缓存)实现的。当调用`save()`, `update()`, `delete()`等方法时,Hibernate不会立即执行SQL语句,而是将这些操作记录在缓存中。直到Flush操作发生时,...

    Hibernate深入浅出

    Hibernate提供了第一级缓存和第二级缓存,通过合理设置可以提高应用性能。另外,懒加载和即时加载策略也会有所涉及,这些策略有助于优化数据获取的效率。 此外,书中还会讲解如何进行性能优化,包括批处理、延迟...

    Hibernate3.3 中文参考

    Hibernate 3.3 提供了多种缓存策略,包括一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如Ehcache和Infinispan的集成。这些策略有助于提高性能并降低数据库负载。 ### ...

    Manning-Java.Persistence.with.Hibernate 英文版

    4. **缓存机制**:讨论Hibernate的级联缓存策略,包括一级缓存(Session缓存)和二级缓存(SessionFactory缓存),以及第三方缓存服务如 EhCache 和 Infinispan 的集成。 5. **性能优化**:分析可能影响Hibernate...

    Manning.Java.Persistence.with.Hibernate[Hibernate实战第二版].pdf

    该书详细介绍了Hibernate的基础概念、配置、实体管理、查询语言(HQL和Criteria API)、关联映射、缓存策略、性能优化以及高级特性。通过实际案例,读者可以了解到如何在项目中有效地使用Hibernate进行数据持久化。书...

    hibernate快速学习指南

    2. 缓存:提高性能,分为一级缓存(Session级别)和二级缓存(SessionFactory级别),可自定义实现第三方缓存服务。 七、事务处理 在Hibernate中,事务管理是非常关键的一部分,可以使用Transaction接口来控制事务...

    《Hibernate快速入门手册》

    8. **缓存机制**:理解Hibernate的缓存策略,包括一级缓存和二级缓存,以及如何自定义缓存配置。 9. **事务管理**:学习Hibernate的事务处理,包括自动提交、显式事务控制和事务隔离级别。 10. **性能优化**:讨论...

    hibernate电子书 chm

    5. **缓存机制**:探讨Hibernate的一级缓存和二级缓存,以及第三方缓存插件如Ehcache的配置和使用。 6. **查询优化**:讲解如何提高Hibernate的查询性能,避免N+1查询问题,以及批处理和懒加载的策略。 7. ** ...

    hibernate帮助的相关文档

    其次,"Hibernate ORM用户指南"深入讲解了Hibernate的高级特性,如缓存机制、第二级缓存配置、级联操作、关联映射策略等。这个文档还会介绍如何使用Criteria API进行动态查询,以及如何处理复杂的一对多、多对一、一...

    hibernate.pdf 中文版

    - **缓存机制**:探讨一级缓存和二级缓存的工作原理及其配置方法。 - **事务处理**:讲解Hibernate如何管理事务边界,确保数据一致性。 - **批量处理**:提供提高数据操作效率的策略,如批量插入、更新等。 #### ...

    Hibernate程序高手秘笈.part04-06.rar

    8. **缓存机制**:Hibernate的缓存策略,包括一级缓存(Session级别的)和二级缓存(SessionFactory级别的),以及第三方缓存集成,如 EhCache。 9. **事务管理**:介绍Hibernate的事务处理,包括编程式和声明式...

    hibernate培训教程PPT(钱安川).zip

    教程会介绍第一级缓存和第二级缓存的概念,以及如何配置和使用缓存来提高应用程序性能。同时,事务管理也是必不可少的话题,包括本地事务和分布式事务的处理。 最后,教程可能会涵盖一些高级主题,如Hibernate的...

Global site tag (gtag.js) - Google Analytics