hibernate 一级缓存

简介:

每个session有一个一级缓存,session打开,一级缓存创建,session关闭,一级缓存就销毁。

当使用get或load方法按id查询对象时,首先查询缓存中是否有此对象:

有,直接返回此对象;

没有,才查询数据库,并将查询到的对象放入一级缓存。

如果是用hql语句查询,则会绕过一级缓存,但要注意,hql的查询结果会被打散了放入一级缓存,即hql查询的集合结果不会整体放入一级缓存,但集合中每个元素会被放入以及缓存

使用hibernate新增一万个对象,经常会出现内存耗尽异常,如何解决?

原理:    Session session = ...;
    session.beginTransaction();
    for(int i = 0; i < 10000; i++){
        City c = new City();
        c.setName("城市" + i);
        session.save(c);
    }
// 循环完毕,内存中存储了一万个city对象,导致内存占用高
    session.getTransaction().commit();
解决:     

    Session session = ...;
    session.beginTransaction();
    for(int i = 0; i < 10000; i++){
        City c = new City();
        c.setName("城市" + i);
        session.save(c);
        session.flush(); // 循环一次,立刻执行insert语句 
        session.evict(c); // 并从一级缓存中清除该对象
    }
    // 循环完毕,一级缓存仍是空的,不会占用太多内存
    session.getTransaction().commit();

session flush在commit之前默认都会执行他。也可以手动执行它,主要做了两件事:
1) 清理缓存。
2) 执行SQL。


本文转自 l363130002 51CTO博客,原文链接:http://blog.51cto.com/liuyj/1693653

相关文章
|
9月前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
164 5
|
10月前
|
缓存 Java 数据库连接
Hibernate 中的查询缓存是什么?
【8月更文挑战第21天】
78 0
|
10月前
|
存储 缓存 Java
|
10月前
|
存储 缓存 Java
Hibernate 中默认启用二级缓存吗?
【8月更文挑战第21天】
72 0
|
10月前
|
存储 缓存 Java
Hibernate 中的二级缓存是什么?
【8月更文挑战第21天】
84 0
|
10月前
|
缓存 Java 数据库连接
Hibernate 中的一级缓存是什么?
【8月更文挑战第21天】
148 0
|
缓存 Java 数据库连接
hibernate二级缓存
在配置和使用Hibernate二级缓存时,你应该根据应用的需求和性能要求,合理选择缓存提供者和配置参数,以达到性能优化的目的。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
97 1
|
缓存 Java 数据库连接
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
208 0
|
缓存 Java 数据库连接
Hibernate - 查询缓存和时间戳缓存区域使用详解
Hibernate - 查询缓存和时间戳缓存区域使用详解
115 0
|
SQL 缓存 Java
Hibernate - 整合Ehcache二级缓存使用详解
Hibernate - 整合Ehcache二级缓存使用详解
108 0
OSZAR »