zoukankan      html  css  js  c++  java
  • Hibernate 二级缓存疑难点

    1. 一级缓存:缓存实体
    2. 二级缓存:缓存实体
    3. Hibernate查询缓存缓存的是查询出来的实体的部分属性结果集和实体的ID(注意这里不是实体)。
    4. Hibernate查询缓存:对List起作用。但是Hibernate查询缓存对Iterator不起作用,只对List起作用。

    Iterator不考虑缓存,必会执行,且仅查询出实体id的集合。

    Iterator iter = session.createQuery("from GoUser").iterate();
    for(;iter.hasNext();){
        GoUser u = (GoUser) iter.next();
        System.out.println(u.getName());
    }

    说明:Iterator这种方式会得到实体的id集合,查询实体的具体属性时会重新向数据库发出请求。

    如果开启二级缓存,循环遍历时二级缓存会将实体保存。

    关闭二级缓存,开启查询缓存的情况下

    Session session = sf.openSession();
    session.beginTransaction();
    List<User> list = (List<User>) session.createQuery("from User")
            .setCacheable(true).list();
    for (User u : list) {
        System.out.println(u.getName());
    }
    session.getTransaction().commit();
    session.close();
    System.out.println("-----------------分割线------------------");
    Session session2 = sf.openSession();
    session2.beginTransaction();
    List<User> list2 = (List<User>) session2.createQuery("from User")
            .setCacheable(true).list();
    for (User u : list2) {
        System.out.println(u.getName());
    }
    session2.getTransaction().commit();
    session2.close();

    执行结果:

    说明:

    关闭二级缓存,开启查询缓存的情况下,第一次list查询,将所有实体的属性信息查询出来,只执行了一条语句,然后仅保存了实体id的列表,所以第二次查询时,由查询缓存中的id去数据库中取实体数据。

    二级缓存、查询缓存都开启的情况下

    代码如上例

    执行结果:

    说明:

    二级缓存和查询缓存都开启的情况下,由于查询语句相同,则从查询缓存中查找对应的id集合,然后根据id再从二级缓存中查找对应的实体,所以只执行一次数据库操作。

  • 相关阅读:
    sql查询重复记录、删除重复记录方法大全
    查询字段所在的表/视图
    查询某张表被哪些存储过程或者视图用到的sql语句
    SQL中char、varchar、nvarchar的区别
    JS快速获取图片宽高的方法
    Git代码冲突常见解决方法
    HTML__图片轮播ion-slide-box
    oracle列出两个日期间所有日期
    myeclipse 8.0 注册码
    网页中图片旋转的几种实现方式
  • 原文地址:https://www.cnblogs.com/tianyuchen/p/6323120.html
Copyright © 2011-2022 走看看