HIbernate的一级缓存和快照

数字图像处理 基于OpenCV的景深融合算法 还有的思路是对图像序列中的每一张图像分别进行拉普拉斯金字塔拆分,提取出每一张图像的高频信息和低频信息,得到所述图像序列对应的高频信息集合和低频信息集合。然后根据所述高频信息集合得到合成后的高频信息,对所述低频信息集合进行导向滤波处理得到合成后的低频信息,根据所述合成后的高频信息和低频信息做拉普拉斯金字塔重构,得到一张超景深图像。这里声明了几个变量,ImMer是最终合成的图像,coll是中间处理的变量,Coll_Ori是保存原图像数据的变量,dstWidth目标图像宽度(一般都是与原始图像大小一致)。 阅读详情
什么是Hibernate的一级缓存

       Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先使用对象属性的OID值在Hibernate的一级缓存种进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存种取出使用,不会再查询数据库;如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数。\color{red}{Hibernate的一级缓存的作用就是减少对数据库的访问次数。}Hibernate的一级缓存的作用就是减少对数据库的访问次数。

       在Session接口的实现中包含一系列的Java集合,\color{red}{一系列的Java集合,}一系列的Java集合,这些Java集合构成了Session缓存。只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期。所以一级缓存也被称为是Session基本的缓存。

Hibernate的一级缓存有如下特点:

  • 当应用程序调用Session接口的save()、update()、saveOrUpdate()时,如果Session缓存中没有相应的对象,Hibernate就会自动的把从数据库中查询到的相应对象信息加入到一级缓存中去。
  • 当调用Session接口的load()、get()方法,一级Query接口的list()、iterator()方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,再去数据库中查询对应对象,并添加到一级缓存中。
  • 当调用Session的close()方法时,Session缓存会被清空。
测试一级缓存

配置orm元数据:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itheima.domain" >
	<class name="Customer" table="cst_customer" >
		<id name="cust_id"  >
			<generator class="increment"></generator>
		</id>
		<property name="cust_name" column="cust_name" ></property>
		<property name="cust_source" column="cust_source" ></property>
		<property name="cust_industry" column="cust_industry" ></property>
		<property name="cust_level" column="cust_level" ></property>
		<property name="cust_linkman" column="cust_linkman" ></property>
		<property name="cust_phone" column="cust_phone" ></property>
		<property name="cust_mobile" column="cust_mobile" ></property>
	</class>
</hibernate-mapping>

测试方法:

package pers.zhang.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import pers.zhang.domain.Customer;

//测试一级缓存
public class Demo {

	@Test
	//证明一级缓存存在
	public void fun1(){
		Configuration conf = new Configuration().configure();
		SessionFactory sessionFactory = conf.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer c1 = session.get(Customer.class, 1l);
		Customer c2 = session.get(Customer.class, 1l);
		Customer c3 = session.get(Customer.class, 1l);
		Customer c4 = session.get(Customer.class, 1l);
		Customer c5 = session.get(Customer.class, 1l);
		
		System.out.println(c3==c5);//true

		tx.commit();
		session.close();
	}
}

运行JUnit测试输出:

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_source as cust_sou3_0_0_,
        customer0_.cust_industry as cust_ind4_0_0_,
        customer0_.cust_level as cust_lev5_0_0_,
        customer0_.cust_linkman as cust_lin6_0_0_,
        customer0_.cust_phone as cust_pho7_0_0_,
        customer0_.cust_mobile as cust_mob8_0_0_ 
    from
        cst_customer customer0_ 
    where
        customer0_.cust_id=?
true

在以上代码中,第一次执行Session的get()方法获取customer对象时,由于一级缓存中没有数据,所以Hibernate会向数据库发送一条SQL语句,查询id等于1的对象;
当再次调用了Session的get()方法获取customer2对象时,将不会再发送sql语句,这是因为customer2对象是从一级缓存中获取的。
缓存原理如下图:
在这里插入图片描述

一级缓存的内部结构:(快照区)

Customer表如下:
在这里插入图片描述
测试方法:

@Test
	//
	public void fun2(){
		Configuration conf = new Configuration().configure();
		SessionFactory sessionFactory = conf.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		
		Customer c1 = session.get(Customer.class, 1l);
		
		c1.setCust_name("百度");//第一次修改客户名
		c1.setCust_name("Google");//第二次改回原来的Google
		
		tx.commit();
		session.close();
	}

运行JUnit测试输出:

Hibernate: 
    select
        customer0_.cust_id as cust_id1_0_0_,
        customer0_.cust_name as cust_nam2_0_0_,
        customer0_.cust_source as cust_sou3_0_0_,
        customer0_.cust_industry as cust_ind4_0_0_,
        customer0_.cust_level as cust_lev5_0_0_,
        customer0_.cust_linkman as cust_lin6_0_0_,
        customer0_.cust_phone as cust_pho7_0_0_,
        customer0_.cust_mobile as cust_mob8_0_0_ 
    from
        cst_customer customer0_ 
    where
        customer0_.cust_id=?

为何我们修改了数据却没有打印update的sql语句?因为快照的存在。

在这里插入图片描述

Hibernate向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库中,并更新快照;如果一致,则不执行update语句。\color{red}{这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库中,并更新快照;如果一致,则不执行update语句。}这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库中,并更新快照;如果一致,则不执行update语句。Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。

【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(二) - 网络规划 2. 全三层架构设计思路 采用全三层网络架构设计的出发点是: 使用尽量少的交换机高级功能,可以尽可能减少由于功能bug故障造成的问题; 使用尽量少的网络协议,以兼容不通厂商的网络设备 实现简单,易于维护,绝对可靠的路由协议; 通过控制路由来调度流量,尽量减少设备或协议的故障域; 牺牲高级功能带来的便捷,得到更高的可用性和性能; 由上述原则,本文的设计选择只使用静态路由和BGP... 阅读详情

相关推荐

智能车八邻域图像算法

智能车八邻域图像算法

技术缝合怪的博客 4万+

Hibernate缓存机制之快照

Hibernate缓存机制之快照(1)、快照是数据的副本 (2)、快照属于一级缓存 (3)、快照是在堆内存中的 (4)、快照的作用:保证数据一致性 当执行`session.getTransaction().commit()时,Hibernate同时会清理session的一级缓存(flush),也就是将堆内存中的数据与快照中的数据进行对比,如果不一致,则会执行同步(update)操作,

浪丶荡 7136

Ubuntu20.04系统Cuckoo sandbox所需环境搭建及安装(超详细图文)

请勿叫我大神,我只是互联网的搬运工~ 前言 本教程以Ubuntu20桌面版作为示范,服务器版同样适用,但可能稍微麻烦一点,服务器版本的话安装Xmanage套装使用可能会相对轻松一些,由于后面会使用到vbox的使用,对vbox命令行操作不熟悉的小伙伴用xmanage可能会相对轻松一点。 提示:以下是本篇文章正文内容,下面案例可供参考 安装ubuntu20桌面版 步骤1:转到https://ubuntu.com/download/desktop下载下载.iso。 步骤2:使用您选择的虚拟机监控程序(VMWa

ElsonHY的博客 1万+

关于Hibernate一级缓存和快照的理解

Hibernate的一级缓存和快照 hibernate的一级缓存属于session级别的缓存。它存在的目的是为了提高代码的效率,减少访问数据库的次数。程序在调用方法操作数据时,hibernate会发送一条sql语句获取到数据后再由hibernate组装之后返回给程序。如果程序需要多次操作同一数据时,hibernate就要不断的向数据库发送sql语句,这样就大大降低了程序的执行效率。hibernat...

羽枫760的博客 533

数字IC笔记-逻辑单元库和库文件

逻辑单元库的建立: 一个完整的单元库是由不同的功能电路所组成,在芯片应用中可分为三类: 标准单元:反相器、与门、寄存器、选择器、全加器。组合逻辑电路和时序逻辑电路。互补,反向,非反向,其他。锁存器、寄存器。 模块宏单元:ROM、RAM 输入输出单元 库文件: 在逻辑综合产生门级网表和物理设计做布局布线的过程中需要两个重要的库文件,就是物理库(lef)和时序库(lib) 1.物理库LEF文件 LEF是版图级的抽象文件,主要用于布局和布线。目前普遍使用的是由Candence开发的LEF文件格式,以le

sinat_41774721的博客 9140

设计师必看!用Figma MCP自动生成开发文档的隐藏技巧

本文为设计师揭秘利用Figma MCP协议自动生成开发文档的隐藏技巧。通过将设计稿转化为结构化数据,实现设计规范的自动化输出、版本同步与动态更新,并借助AI助手提升协作效率,彻底告别繁琐的手动标注与沟通。

berry的博客 923

Hibernate学习之路(5) Hibernate一级缓存与快照区

Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预;二级缓存是SessionFactory级别的缓存,该级缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存; 一,缓存的概念 缓存是位于应用程序和永久性数据存储源之间用于临时存放复制数据的...

QEcode的博客 1039

从JX-2R-01热敏打印机芯到稳定打印:硬件设计与时序控制的实践指南

本文详细解析了JX-2R-01热敏打印机芯的硬件设计与驱动开发全流程。核心内容包括:实现严格的双电源上电时序控制、采用PWM恒流驱动步进电机确保走纸平稳,以及精确控制SPI数据加载与加热脉冲时序以获得清晰打印效果。文章提供了从电路设计、芯片选型到代码调试的实战指南,旨在帮助开发者构建稳定可靠的热敏打印模块。

weixin_29169899的博客 217

hibernate的缓存和快照 (转载)

Hibernate我们已经学了四天,该讲的知识我们已经讲完,明天放假,后天练习一天就要结束hibernate的学习,有点不舍的,想来hibernate也不是传说中的那么难,在次将hibernate中三个比较重要的概念在次总结一下。 hibernate存在2个缓存   * 第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存(session的一级缓存)   * 第二

jing_44944的专栏 2497

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 587

〖Python WEB 自动化测试实战篇⑤〗- selenium 元素定位详解 - (八大元素定位方式)

测试对象的定位和操作是我们利用 selenium 编写自动化脚本和 webdriver 的核心内容,其中 "操作" 这一部分又是建立在 "selenium" 元素定位的基础之上的。所以对元素对象的定位就显得越发的重要,接下来我们就学习一下常用的元素定位方法有哪些。......

易编橙 · 终身成长社群,相遇已是上上签! 4万+

Hibernate一级缓存-快照机制

案例:修改客户的名称 @Test publicvoid testUpdateName(){        //从Hibernate封装的工具类中获取Session对象        Sessionsession=HibernateUtil.openSession();        //开启事务        Transactiontx=session.beginTransact

站在风口上的猪 1643

MoCap 动作捕捉开源库教程

数据通过 tf2 和支持不同 QoS 设置的 /poses 主题直接发布。该软件包最初是为 Crazyswarm 开发的,用于跟踪多达 50 个飞行机器人。

机器人控制与仿真应用 1307

Hibernate(二)一级缓存、快照机制和三种状态

11

Waylon的博客 6024

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入理解Hibernate的一级缓存和快照

hibernate分为: 一级缓存也就是 Session 级别的缓存,它是属于事务范围的缓存 二级缓存也就是 SessionFactory 级别的缓存,它是属于进程范围的缓存 session的一级缓存 使用hibernate进行查询的时候,将查询结果放置到session的一级缓存中,在一级缓存中存在对象,对象使用属性的OID的值进行区分,此时再使用相同的OID进行查询的时候,首先会在session...

yangguang330的博客 288

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Hibernate对象管理状态、加载策略、一级缓存和快照

这里写目录标题一级目录二级目录三级目录 一级目录 二级目录 三级目录

Dawn.x的博客 238

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

hibernate优化策略02一级缓存和快照

一、什么是Hibernate的一级缓存session将一个对象加入自己的管理范围内,其实也就是把该对象放入自己的一级缓存中。Hibernate的一级缓存是指Session级别的缓存,它是一块内存空间,由Hibernate管理,无需干预。有了一级缓存,应用程序可以减少访问数据库的次数,提高性能。查询时:首先会使用对象属性的OID值(对应表中的主键)在Hibernate的一级缓存进行查找:如果找到,则...

Saint_LMY的博客 284

Hibernate框架复习08-hibernate中的一级缓存和快照区(理解)

hibernate中存的一级缓存 缓存的作用:优化数据库操作的性能,对于相同的内容,可以直接在缓存中直接取,不用再次访问数据库 hibernate中的一级缓存:属于session级别(本质是session中的一系列集合),生命周期和session一致 一级缓存在hibernate中的应用:当调用数据库操作的时候,如果session缓存中没有相应的对象,就会在缓存中保存一份。再次查询的时候如果...

230

hibernate 啥叫一级缓存和快照?

一.hibernate中的实体创建规则 1>对象必须有oid. 2>对象中的属性,尽量使用包装类型 3>不使用final修饰类 4>提供get/set方法.... 二.hibernate主键生成策略(7种) increment: 查询最大值.再加1 identity: 主键自增. sequence:Oracle使用的 hilo: hibernate自己实现自增算法 n...

BoringError的博客 4064

SSH系列:Hibernate中的一级缓存和快照

      一级缓存session:线程级别。 二级缓存:进程级别       快照:       1、快照是数据的副本        2、快照属于一级缓存        3、快照是在堆内存中的        4、快照的作用:保证数据一致性        5、快照的理解:当执行session.getTransaction().commit()时,       Hibernate同时会清理sessi...

weixin_37891342的博客 326

hibernate一级缓存和快照

很多人知道hibernate一级缓存,却不知道什么是快照。。。。 快照-----是内存中数据的一个副本,当刷新缓存时,会与快照中的数据相对比,发现不一致,就会发出update语句,更新数据库。 下图引用于网络(分析的比较清晰) 1. 当一级缓存和快照不一致的时候,会先发...

chrdw1234567的博客 173

hibernate一级缓存和快照机制

Hibernate缓存机制之快照 (1)、快照是数据的副本  (2)、快照属于一级缓存  (3)、快照是在堆内存中的  (4)、快照的作用:保证数据一致性  当执行`session.getTransaction().commit()时,Hibernate同时会清理session的一级缓存(flush),也就是将堆内存中的数据与快照中的数据进行对比,如果不一致,则会执行同步(update)操作,若相...

qq_22339269的博客 236

hibernate对象的三种状态,一级缓存和快照

1.hibernate对于对象的操作有, 瞬时 : 对象没有oid,与session没有关联     刚new的对象---在执行save()方法会变成持久 游离 :对象有oid,与session没有关联          new出对象后,设置id,执行update()会变成,持久 持久 :对象有oid ,与session有关联            session.get(1) 直接就是持久...

Dream的博客 251

hibernate之管理对象的三种状态及一级缓存和快照(面试题)及加载策略和并发控制

转载请标明出处:https://blog.youkuaiyun.com/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 hibernate之管理对象的三种状态及一级缓存和快照(面试题)及加载策略和并发控制1.对象的三种状态(hibernate管理的对象)1.1 临时状态1.2 持久状态1.3 游离状态2.一级缓存、快照(面试题)2.1 一级缓存的概念2.2 快照的概念3.加载策略3.1 立即加载3.2 延迟加载 1.对象的三种状态(hibe.

men_ma的博客 197

Hibernate 中一级缓存和快照区的理解

刚刚开始的时候觉得这个快照区很难理解,在网上看了很多博客之后,开始明白了。我是结合 ADO.NET 理解的,在ADO.NET 中有一个类, 叫 SqlCommandBuilder,在我看来,他就是 ADO.NET 中和 Hibernate 快照区对应的东西,这个 SqlCommandBuilder 可以构建 SQL 语句,并且当调用Update 方法之后,可以将数据库中的信...

ddd77197的博客 209

Hibernate框架之一级缓存与一级缓存快照

在上一篇博客 Hibernate框架之实体的三种状态 引入了session缓存的概念,下面将介绍一下一级缓存与一级缓存快照。 1、一级缓存 所谓一级缓存,又称为session级别的缓存(就是上一篇博客引入的session缓存)。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(实体类的对象),为程序优化服务,如果之后需要相应的数据,...

hestyle的博客 358
上一篇: HIbernate中持久化对象的三种状态
下一篇: HIbernate中的事务
吴声子夜歌
博客等级 码龄9年 2687粉丝 2257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值