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 ...
随机推荐
- mysql5.7.22 下载过程
进入官网www.mysql.com ,选择downloads: 选择 Community 再选择MySQL community server 选择5.7的版本,这个看自己选择,有问题看标题 选择5.7 ...
- jQuery----奇偶选择器和索引选择器
奇偶选择器: $( " #uu>li:odd").css( " backgroundColor "," red " ); 获取id为u ...
- Qt中插入html样式
Qt中引入html调节样式 HTML 设置行间距字体高度和颜色 <html><head/><body><p style=\"height:16px; ...
- 远端访问MySQL
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackgao@gmail. ...
- NGUI可展开列表的实现
本文来自网易云社区 作者:汪毅军 最近使用了NGUI做了下可展开列表,其主要思路如下:首先最外层使用Scroll view以达到滑动效果,然后列表使用UITable进行排列,最后通过点击Item控制I ...
- 使用efwplusScript开发Winform程序【像小程序那样开发PC软件】
一.前言 本人从事多年医疗管理软件的开发,在医院大多数的软件都还是CS程序,BS程序很少,对于使用者来说CS的操作体验确实比BS的要好. 1.CS的缺点就是升级麻烦,每次有新版本都需要所有客户端操作升 ...
- 我们一起来聊聊并发吧,one。
引言 最近工作当中写了一个有关并发的程序,引起了LZ对并发的强烈兴趣.这一下一发不可收拾,LZ用了一个多星期,看完了这本共280+页的并发编程书.之所以能看这么快,其实这主要归功于,自己之前对并发就有 ...
- Linux之linux入门
学习linux之前先了解一下操作系统: 操作系统的定义: 操作系统(英语:operating system,缩写作 OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内 ...
- xshell提示评估过期怎么办?
刚刚打开xshell准备连上虚拟机写代码,结果提示评估过期,真的很气,在百度上找了好久才找到解决办法,现在分享给大家:. 1.复制这个链接在浏览器打开https://www.netsarang.com ...
- svn图文教程-宋正河整理
下载地址:http://download.csdn.net/download/songzhengdong82/4433476 在线浏览:http://wenku.baidu.com/view/07f1 ...