当前位置: 首页 > news >正文

Hibernate 脏检查和刷新缓存机制

刷新缓存:

  Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对象包含的变化数据更新到数据库中,这一过程成为刷新缓存.

脏检查:

  当刷新缓存时,Hibernate会对Session中的持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断成为脏检查,

脏检查的原理:

  当一个对象被加入到Session缓存中时,Session会为对象的值类型的属性复制一份快照.当Session刷新缓存时,会先进行脏检查,即比较对象的当前属性与它的快照,来判断对象的属性是否发生了改变,如果发生了改变,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中.

运行结果:

从结果可以看出,sql语句只生成了一次,证明第二次修改经过脏检查发现数据并没有进行改变,所以没有向数据库发送SQL语句!

缓存清理机制

当Session缓存中对象的属性每次发生了变化,Session并不会立即清理缓存和执行相关的SQL update语句,而是在特定的时间点才清理缓存,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,一遍减少访问数据库的次数,从而提高应用程序的数据访问性能。

在默认情况下,Session会在以下时间点清理缓存。

  1. 当应用程序调用org.hibernate.Transaction的commit()方法的时候.commit方法先清理缓存,然后再向数据库提交事务。Hibernate之所以把清理缓存的时间点安排在事务快结束时,一方面是因为可以减少访问数据库的频率,还有一方面是因为可以尽可能缩短当前事务对数据库中相关资源的锁定时间。
  2. 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会清理缓存,使得Session缓存与数据库已经进行了同步,从而保证查询结果返回的是正确的数据。
  3. 当应用程序显示调用Session的flush()方法的时候。

相关文章:

  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
  • EMG肌肉信号处理合集 (一)
  • 【DP】mobiusp正在创作乐曲
  • ubuntu20.04配置OpenCV的C++环境
  • 深度学习之基于YoloV3杂草识别系统
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件
  • 操作系统 应用题 例题+参考答案(考研真题)
  • 【Ambari】HDFS基于Ambari的常规运维
  • 基于C#实现赫夫曼树
  • ②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
  • Mysql并发时常见的死锁及解决方法
  • 【RTP】RTPSenderAudio::SendAudio
  • .Net6使用WebSocket与前端进行通信
  • C++类与对象(5)—流运算符重载、const、取地址
  • 通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践
  • $translatePartialLoader加载失败及解决方式
  • 【EOS】Cleos基础
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Median of Two Sorted Arrays
  • Octave 入门
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之索引简介
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 新版博客前端前瞻
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (C语言)球球大作战
  • (TOJ2804)Even? Odd?
  • (动态规划)5. 最长回文子串 java解决
  • (算法)前K大的和
  • (转)负载均衡,回话保持,cookie
  • .NET 8.0 发布到 IIS
  • .NET 依赖注入和配置系统
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET简谈设计模式之(单件模式)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • /etc/fstab 只读无法修改的解决办法
  • [ C++ ] STL---stack与queue
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [acm算法学习] 后缀数组SA
  • [Android Pro] Notification的使用
  • [C/C++]关于C++11中的std::move和std::forward
  • [CF482B]Interesting Array
  • [CISCN2019 华东南赛区]Web11
  • [GN] DP学习笔记板子
  • [Hibernate] - Fetching strategies
  • [js]js设计模式小结
  • [LeetCode 127] - 单词梯(Word Ladder)
  • [one_demo_13]ArrayList去除重复的元素
  • [PHP]严格类型