一级缓存及二级缓存

一级缓存也是Session 缓存

    一个链接用户的多次查询使用缓存

    跨用户 则无缓存

    hibernate自带的

get和load都会填充并利用一级缓存

二级缓存(需要我们自己配置)

    SessionFactory 缓存

    可以跨用户的

 

list 方法会使用一级缓存 ,但是不会填充一级缓存

iterator会填充过一级缓存 耗时的

 

N+1问题

当我们使用iterate 进行迭代
又要使用内部的数据,则会发送1+n条sql

第一条先load 拿到id 对象改变对象则会改变

再取get每一个的id

 

 

Saveor update

/*

     * 如果一个对先查找出来的,则会调用update语句

     * 如果没有查
则调用insert语句

     */

    public
static
void testSaveorUpdate(Emp e){

        Session session=HibernateSessionFactory.getSession();

        Transaction tx=session.beginTransaction();

        session.saveOrUpdate(e);

        tx.commit();

        HibernateSessionFactory.closeSession();

    }

 

 

例子代码

package com.pcx.dao;

 

import java.util.Iterator;

import java.util.List;

 

import org.hibernate.Session;

 

import com.pcx.model1.Dept;

import com.pcx.model1.Emp;

import com.pcx.util.HibernateSessionFactory;

 

public
class CacheTest {

    public
static
void main(String[] args) {

        Emp e=fetchTest2();

        System.out.println(e.getDept());

    }

    //

    public
static
void cacheTest(){

        Session session=HibernateSessionFactory.getSession();

        Emp emp=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp.getName());

        

        Emp emp1=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp1.getName());

        HibernateSessionFactory.closeSession();

        

    }

    //get和load都是會填充一级缓存的

    public
static
void cacheTest2(){

        Session session=HibernateSessionFactory.getSession();

        Emp emp=(Emp) session.load(Emp.class, 1);

        

        System.out.println(emp.getName());

        

        Emp emp1=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp1.getName());

        HibernateSessionFactory.closeSession();

        

    }

    

    public
static
void cacheTest3(){

        Session session=HibernateSessionFactory.getSession();

        String hql="from Emp e where e.id=1";

        
 

        
 

        

        List<Emp> emps=session.createQuery(hql).list();

        for (Emp emp : emps) {

            System.out.println(emp.getName());

        }

        

        //这儿没有用上一级缓存

        List<Emp> emps2=session.createQuery(hql).list();

        for (Emp emp : emps2) {

            System.out.println(emp.getName());

        }

        HibernateSessionFactory.closeSession();

        

    }

    public
static
void testload(){

        Session session=HibernateSessionFactory.getSession();

        Emp e=(Emp) session.load(Emp.class, 2);

        

        System.out.println(e.getId());

        System.out.println(e.getName());

        e.setName("lllll");

        HibernateSessionFactory.closeSession();

    }

    //n+1问题

    //当我们使用iterate 进行迭代
又要使用内部的数据,则会发送1+n条sql

对象则会改变

    

//    再取get每一个的id

    /**

     *

     */

    public
static
void cacheTest4(){

        Session session=HibernateSessionFactory.getSession();

        String hql="from Emp";

        

        Iterator<Emp> iter=session.createQuery(hql).iterate();

        while (iter.hasNext()) {

            Emp e=iter.next();

            System.out.println(e.getName());

            

        }

        HibernateSessionFactory.closeSession();

        

    }

    /**

     * 配置二级缓存最好的方式是在每个类的配置
添加 <cache usage="read-only"/>标记

     */

    public
static
void cacheTest5(){

        Session session=HibernateSessionFactory.getSession();

        Emp emp=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp.getName());

        session.evict(emp);//清理一级缓存 //如果二级缓存关闭的话会查询两次

        Emp emp1=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp1.getName());

        HibernateSessionFactory.closeSession();

    }

    public
static
void cacheTest6(){

        Session session=HibernateSessionFactory.getSession();

        Emp emp=(Emp) session.get(Emp.class, 1);

        

        System.out.println(emp.getName());

        session.evict(emp);//清理一级缓存 //如果二级缓存关闭的话会查询两次

        Session session2=HibernateSessionFactory.getSession();

        Emp emp1=(Emp) session2.get(Emp.class, 1);

        

        System.out.println(emp1.getName());

        HibernateSessionFactory.closeSession();

    }

    /*

     * 抓取策略

     * Fetch 为join的话
就没有lazy了
就直接把dept对象都加载了

     */

    public
static Emp fetchTest2(){

        Session session=HibernateSessionFactory.getSession();

        Emp emp=(Emp) session.load(Emp.class, 1);

        Dept d=emp.getDept();

        

        

//        System.out.println(emp.getName());

//        System.out.println(d.getName());

        HibernateSessionFactory.closeSession();

        return emp;

    }

}

 

 

Fecat="join"

fatch 默认只就是select

    join 也将关联的对象一并加载进

来了,并不管是否懒加载

 

错误:No row with the given identifier exists: [com.pcx.model1.Emp#1000]

    at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:386)

说明表中没有本条数据

Hibernate笔记④--一级二级缓存、N+1问题、saveorupdate、实例代码的更多相关文章

  1. Hibernate的一级二级缓存机制配置与测试

    特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...

  2. Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)

    一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...

  3. hibernate 5的二级缓存案例讲解

    hibernate 5的二级缓存案例讲解 本帖最后由 鱼丸儿 于 2018-1-20 11:44 编辑 大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑 那么在这 ...

  4. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)

    踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...

  5. Hibernate中 一 二级缓存及查询缓存(1)

    最近趁有空学习了一下Hibernate的缓存,其包括一级缓存,二级缓存和查询缓存(有些是参照网络资源的): 一.一级缓存     一级缓存的生命周期和session的生命周期一致,当前sessioin ...

  6. Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...

  7. 具体解释Hibernate中的二级缓存

    1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...

  8. hibernate 查询、二级缓存、连接池

    hibernate 查询.二级缓存.连接池 查询: 1) 主键查询 Dept dept =  (Dept) session.get(Dept.class, 12); Dept dept =  (Dep ...

  9. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

随机推荐

  1. php生成带自定义logo和带二维码跳转自定义地址的二维码

    index.php<?phpheader('Content-type:text/html;charset=UTF-8');// 指定允许其他域名访问header('Access-Control- ...

  2. C语言的一道数组题Plus

    其实数组那部分当时学的东西挺简单的. 常见的题就是用一个数组装几个数字. 然后排序,找出大于n的数字有几个,有几个重复数字之类的. 去年想出来一个题. 因为以前写的代码太复杂,又有很多不足和bug.所 ...

  3. 经典算法--冒泡排序(Java)

    原理:将相邻元素的较大值赋给右边 思路:① 1.将集合或数组内的第一个元素与第二个元素进行比较,较大值赋给右边: 2.将第二个元素与第三个元素进行比较,较大值赋给右边: ....... (N-1).将 ...

  4. 20155222 c语言实现pwd命令

    20155222 c语言实现linux的pwd命令 1.学习pwd命令在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录.然 ...

  5. 《Java 程序设计》课堂实践项目-数据库

    <Java 程序设计>课堂实践项目数据库 课后学习总结 目录 数据库实验要求 课堂实践成果 课后思考 由于担心做的不好,找同学询问了数据库的问题,学习了数据库的连通,补写的这篇博客.这是补 ...

  6. [2016北京集训试题15]项链-[FFT]

    Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...

  7. Redis学习之路(二)之Redis入门基础

    一.Redis基本介绍 (1)Redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(string ...

  8. Codeforces 915 C. Permute Digits (dfs)

    题目链接:Permute Digits 题意: 给出了两个数字a,b(<=1e18),保证a,b都不带前缀0.用a的字符重组一个数字使这个值最大且小于b.(保证这个值存在) 题解: 这题遇到了不 ...

  9. cogs1538 [AHOI2005]LANE 航线规划

    套路题+裸题 首先肯定离线,倒过来处理,删边->加边 连边的时候,如果不连通就连,否则在这两个点的链上打个覆盖标记,查询的时候输出没被覆盖的路径条数 #include<cstdio> ...

  10. JetBrains全家桶使用攻略

    JetBrains全家桶使用攻略 今天狠狠心某宝买了一个key,可以使用15款开发软件,在此进行记录. 全家桶链接:https://www.jetbrains.com/products.html?fr ...