zoukankan      html  css  js  c++  java
  • 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()是将缓存全部清空。
  • 相关阅读:
    delphi SysErrorMessage 函数和系统错误信息表 good
    Delphi中ShellExecute使用详解(详细解释10种显示状态)
    几个获取Windows系统信息的Delphi程序
    判断操作系统多久没有任何操作
    MVC4+WebApi+Redis Session共享练习(下)
    MVC4+WebApi+Redis Session共享练习(上)
    EntityFramework使用总结(与MVC4.0实现CURD操作)
    MVC3.0+knockout.js+Ajax 实现简单的增删改查
    基于Redis缓存的Session共享(附源码)
    Redis缓存服务搭建及实现数据读写
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6270446.html
Copyright © 2011-2022 走看看