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 ...
随机推荐
- linux文件系统初始化过程(2)---挂载rootfs文件系统
一.目的 本文主要讲述linux3.10文件系统初始化过程的第一阶段:挂载rootfs文件系统. rootfs是基于内存的文件系统,所有操作都在内存中完成:也没有实际的存储设备,所以不需要设备驱动程序 ...
- 升级时针对Source oracle home 不存在解决办法
针对于oracle升级从11.2.0.4升级至12.1.0.1,遇到的问题解决. 运行/oracle/app/product/12.1.0.1/dbhome_1/bin/dbua 后 在选择数据库ho ...
- Linux入门基础(三):Linux用户及权限基础
用户基础 用户和组 每个用户都拥有一个userid 每个用户都属于一个主组,属于一个或多个附属组 每个组拥有一个groupid 每个进程以一个用户身份运行,受该用户可访问资源限制 每个可登陆用户拥有一 ...
- 时间序列深度学习:状态 LSTM 模型预测太阳黑子
目录 时间序列深度学习:状态 LSTM 模型预测太阳黑子 教程概览 商业应用 长短期记忆(LSTM)模型 太阳黑子数据集 构建 LSTM 模型预测太阳黑子 1 若干相关包 2 数据 3 探索性数据分析 ...
- docker save和docker export的区别
docker save保存的是镜像(image),docker export保存的是容器(container): docker load用来载入镜像包,docker import用来载入容器包,但两者 ...
- 小技巧textbox的行数
没什么技术含量,但如果不知道则实现起来很麻烦. c#中textbox.lines只记录回车的数量,并不是真正的总行数,如何得到呢,请使用: int 总行数 = this.textBox1.GetLin ...
- JavaEE笔记(三)
缓存是通过map储存的 hibernate中一对一关系配置 // 如果A中有B 或者B中有A,那么为单项关联 // 如果A和B互有,那么为双向关联(最常用) class A{ private ...
- Why network port is open but no process attached?(为什么端口被打开,但是没有进程号)
When I check my system today, I noticed a weird output from netstat’s output, joseph# sudo netstat - ...
- 10.23 开课一个月零十九天 (PHP数组)
<?php $s = "he8llo5wor6ld"; $s = preg_replace("/\d/","#",$s); //按照正 ...
- CF 1041 F. Ray in the tube
F. Ray in the tube 链接 题意: 有两条平行于x轴的直线A,B,每条直线上的某些位置有传感器.你需要确定A,B轴上任意两个整点位置$x_a$,$x_b$,使得一条光线沿$x_a→x_ ...