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 ...
随机推荐
- Qt样式总结
说明 将Qt样式进行一下总结, 以后逐步更新 QPushbutton QPushbutton setStyleSheet("QPushButton{ border:1px solid #40 ...
- 求Read Depth
如何划窗统计测序数据的reads数(depth):https://blog.csdn.net/shenshenwu666/article/details/80936374 方法1,用samtools ...
- win10操作系统vs2010编译osg3.4.0问题解决记录
参考博客:OSG3.4.0+VS2010+WIN10编译及二次开发环境搭建 链接:https://blog.csdn.net/hsc1239653453/article/details/7827856 ...
- JavaWeb总结(五)
使用Servlet接受服务器请求信息 HTTP请求示例 HttpServletRequest对象主要用于获取由客户端发送过来的请求头.参数.文件.数据等.Servlet存在的主要目的就是处理请求.Se ...
- [arc081F]Flip and Rectangles-[黑白染色]
Description 传送门 Solution 有一个神秘的结论..我不知道大佬是怎么场上推出来的. 一个黑白染色图,每次可以任意翻转行或列的颜色,如果每个2*2的子矩阵内黑色格子都是偶数个,则可以 ...
- c++ 字符串和字符串库函数
//有2个字符串定义如下: //char s1[38]="www.yjxsoft"; //char s2[]=".com"; //请编写一段代码,把字符串s2追 ...
- 14-HTML-CSS案例
1.超链接美化 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 【oracle查询】oracle查询字段显示#号 (井号)
客户反映字段查询为井号,我自己没有遇到这种情况,于是上网百度了一下. 下面的答案很好地解决了问题,哈哈哈.
- vi/vim 常用命令 之 一图定天下!
直接上干活,一张图解决~
- 【日常训练】 Help Greg the Dwarf(CodeForces-99E)
题意与分析 题意是这样的,问你把一个长方形从一个L型街道的一端移动到另一端,固定了该长方形的长,求他的最大宽. 这种问题我是第一次独立解决(以前都是抱队友大腿QAQ),现在没法子只好自己硬着头皮做,看 ...