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()是将缓存全部清空。
原文地址:https://www.cnblogs.com/kuillldan/p/6270446.html