Hibernate笔记④--一级二级缓存、N+1问题、saveorupdate、实例代码
一级缓存及二级缓存
一级缓存也是Session 缓存
一个链接用户的多次查询使用缓存
跨用户 则无缓存
hibernate自带的
get和load都会填充并利用一级缓存
二级缓存(需要我们自己配置)
SessionFactory 缓存
可以跨用户的
list 方法会使用一级缓存 ,但是不会填充一级缓存
iterator会填充过一级缓存 耗时的
N+1问题
当我们使用iterate 进行迭代
又要使用内部的数据,则会发送1+n条sql
第一条先load 拿到id 对象改变对象则会改变
再取get每一个的id
Saveor update
|
/* * 如果一个对先查找出来的,则会调用update语句 * 如果没有查 */ public 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 public Emp e=fetchTest2(); System.out.println(e.getDept()); } // public 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 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 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 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 进行迭代 对象则会改变
// 再取get每一个的id /** * */ public 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();
} /** * 配置二级缓存最好的方式是在每个类的配置 */ public 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 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的话 */ public 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、实例代码的更多相关文章
- Hibernate的一级二级缓存机制配置与测试
特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...
- Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)
一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...
- hibernate 5的二级缓存案例讲解
hibernate 5的二级缓存案例讲解 本帖最后由 鱼丸儿 于 2018-1-20 11:44 编辑 大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑 那么在这 ...
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
- Hibernate中 一 二级缓存及查询缓存(1)
最近趁有空学习了一下Hibernate的缓存,其包括一级缓存,二级缓存和查询缓存(有些是参照网络资源的): 一.一级缓存 一级缓存的生命周期和session的生命周期一致,当前sessioin ...
- Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...
- 具体解释Hibernate中的二级缓存
1.前言 这篇博客再前几篇博客的基础上来解说一下.Hibernate中的二级缓存.二级缓存是属于SessionFactory级别的缓存机制. 第一级别的缓存是Session级别的缓存,是属于事务范围的 ...
- hibernate 查询、二级缓存、连接池
hibernate 查询.二级缓存.连接池 查询: 1) 主键查询 Dept dept = (Dept) session.get(Dept.class, 12); Dept dept = (Dep ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
随机推荐
- spark本地环境的搭建到运行第一个spark程序
搭建spark本地环境 搭建Java环境 (1)到官网下载JDK 官网链接:https://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...
- JQuery第二天——JQuery的DOM操作
JQuery拥有隐式迭代和显式迭代 因为JQuery为类数组对象,可以使用手动遍历实现显式 .each():也可以使用 $("p").click(function(){ var t ...
- 2017-2018-1 20155209 实现mypwd
2017-2018-1 20155209 实现mypwd 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 首先使用 ...
- Unity3d之Hash&Slash学习笔记之(二)--角色基础类的构建
Hash&Slash学习笔记之(二)--角色基础类的构建 BaseStat类的构建 基本成员变量: _baseValue //基础属性值 _buffValue //增加的buff值 _expT ...
- Wannafly挑战赛24 B 222333
小水题???但是时间限制异常鬼畜,跑了2min \(P | (2^m)*(3^n)-1\)的意思就是\(2^m 3^n = 1 (\text{mod }P)\) 设f[i]表示3^k=i的最小的k 然 ...
- JAVAEE Eclipse 控制台用起来感觉很不方便的原因
这是因为切换成了java面板的原因 因为之前有切换到过 java project 项目,所以才转到了这个面板,之后如果不手动改即便是用javaee也会是这个面板,因而用起来不方便 解决方法: 切换到j ...
- kali下操作 Apache2
Linux系统为Ubuntu 一.Start Apache 2 Server /启动apache服务 # /etc/init.d/apache2 start or $ sudo /etc/init.d ...
- 牛客OI周赛3-提高组-B-1408[dp]
题意 给你长度为 \(n\) 的两个排列 \(A,B\) 组成的序列,求最少的交换相邻数字的次数使得 \(A,B\) 分别有序. \(n\leq 2000\) . 分析 如果只有一个排列时最少交换次数 ...
- 可视化分析 web 访问日志
内容目录 Python 基础 使用模块介绍 可视化组件 echarts 介绍 Web 访问日志 代码解读 讲师:KK 多语言混搭开发工程师,多年 PHP.Python 项目开发经验,曾就职 360.绿 ...
- 复杂值vs原始值&&内存空间
写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...