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

相关文章
|
5天前
|
缓存 Java 数据库连接
hibernate二级缓存
在配置和使用Hibernate二级缓存时,你应该根据应用的需求和性能要求,合理选择缓存提供者和配置参数,以达到性能优化的目的。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
22 1
|
7月前
|
缓存 Java 数据库连接
mybatis之一级缓存和二级缓存~
mybatis之一级缓存和二级缓存~
|
8月前
|
缓存 Java 数据库连接
MyBatis 的一级缓存和二级缓存
MyBatis 的一级缓存和二级缓存
156 0
|
9月前
|
SQL XML 缓存
mybatis的一级缓存和二级缓存
mybatis的一级缓存和二级缓存
92 0
|
9月前
|
存储 SQL 缓存
mybatis中一级缓存和二级缓存
mybatis中一级缓存和二级缓存
67 0
|
SQL 存储 缓存
hibernate的一级缓存
hibernate的一级缓存
90 1
hibernate的一级缓存
|
SQL 存储 缓存
mybatis一级缓存和二级缓存使用详解
mybatis一级缓存和二级缓存使用详解
827 0
mybatis一级缓存和二级缓存使用详解
|
SQL 存储 缓存
Hibernate 一二级缓存
Hibernate 一二级缓存
Hibernate 一二级缓存
|
存储 SQL 缓存
【Mybatis】(四)一级缓存和二级缓存
【Mybatis】(四)一级缓存和二级缓存
168 0
|
SQL 缓存 JavaScript
Hibernate的一级缓存
缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取.
102 0
Hibernate的一级缓存