• Hibernate中一级缓存概念以及flush与clear的区别


    Hibernate采用缓存机制提高数据查询效率。缓存分为一级缓存和二级缓存,一级缓存在Session中存在,二级缓存需要手动配置。

    在一级缓存中,如果数据保存到数据库中后,而session又没有关闭的话,那么这些数据会放到缓存中,再次发出查询请求,Hibernate首先检查缓存中是否有该数据,如果找到该数据,那么就不会向数据库发起查询请求而是直接将缓存中的数据取出。请看下面的例子:

    public class Main
    {
        public static void main(String[] args) throws Exception
        {
            Member member = (Member)HibernateSessionFactory.getSession().get(Member.class, 7);
            System.out.println(member);
              
            Member member1 = (Member)HibernateSessionFactory.getSession().get(Member.class, 7);
            System.out.println(member1);
        }
    }

    上面的代码实际上只向数据库发起了一次查询请求:

    Hibernate: 
        select
            member0_.mid as mid0_0_,
            member0_.age as age0_0_,
            member0_.birthday as birthday0_0_,
            member0_.name as name0_0_,
            member0_.note as note0_0_,
            member0_.salary as salary0_0_ 
        from
            hedb.member member0_ 
        where
            member0_.mid=?
    Member [mid=7, age=22, birthday=2017-01-10, name=admin, note=Good person!, salary=22.22]
    Member [mid=7, age=22, birthday=2017-01-10, name=admin, note=Good person!, salary=22.22]

    这样的机制会大大提高查询效率。

    但是!如果说现在要求你批量保存100000行记录呢?按照此时的道理来讲,这100000行记录都要缓存起来,这样明显会造成一个非常危险的举动,所以在进行实际的开发过程之中,必须要考虑数据的分批处理。

    请看下面的代码:

     1     public static void main(String[] args) throws Exception
     2     {
     3         for (int x = 100; x < 10000; x++)
     4         {
     5             Member vo = new Member();
     6             vo.setName("你好");
     7             vo.setAge(20);
     8             vo.setSalary(1000.0);
     9             vo.setBirthday(new Date());
    10             HibernateSessionFactory.getSession().save(vo);
    11             if (x % 10 == 0)
    12             {
    13                 // 每10条记录进行一次缓冲区的刷新
    14                 HibernateSessionFactory.getSession().flush();
    15                 HibernateSessionFactory.getSession().clear();              
    }
    18 } 19 20 HibernateSessionFactory.getSession().beginTransaction().commit(); 21 }

    上面用到了Session接口的flush()和clear()函数。

    • flush()是将缓存中的所有数据全部提交到数据库中,也就是将缓存中暂未保存到数据库的数据保存到数据库中。
    • clear()是将缓存全部清空。
  • 相关阅读:
    冲刺——第三天
    冲刺——第二天
    梦断代码前三章略有感想
    四则运算法则设计思路
    第一期阅读计划
    软件工程概论第一次课堂小测-------产生30个100以内的随机整数四则运算的小程序
    软件演化
    软件测试
    软件实现
    面向对象设计
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6270446.html
Copyright © 2020-2023  润新知