Hibernate脏检查的剖析
介绍
持久性上下文使实体状态转换进入队列,该实体状态转换在刷新后转换为数据库语句。 对于托管实体,Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE。 这种机制称为自动脏检查 。
默认的脏检查策略
默认情况下,Hibernate检查所有托管实体属性。 每次加载实体时,Hibernate都会复制所有实体属性值。 在刷新时,每个受管实体属性都会与加载时快照值匹配:
因此,每个脏检查的数量由以下公式给出:
哪里
n =受管理实体的数量
p =给定实体的实体数
即使单个实体的仅一个属性发生了变化,Hibernate仍将检查所有托管实体。 对于大量的受管实体,默认的脏检查机制可能会占用大量CPU和内存。 由于初始实体快照是单独保存的,因此持久性上下文所需的内存是所有受管实体通常占用的内存的两倍。
字节码检测
一种更有效的方法是在值更改时标记脏属性。 与原始的深度比较策略类似,优良作法是将域模型结构与更改检测逻辑分离。 自动实体更改检测机制是一个跨领域的问题 ,可以在构建时或运行时进行编织。
实体类可以附加实现自动脏检查机制的字节码级指令。
编织方式
字节码增强可以发生在:
- 构建时间编译休眠实体之后,构建工具(例如ANT , Maven )将在每个已编译实体类中插入字节码级别的指令。 由于类是在构建时增强的,因此此过程不会产生额外的运行时损失。 可以针对增强的类版本进行测试,以便在构建项目之前验证实际的生产代码。
- 运行时可以使用以下方法完成运行时编织:
- Java代理,在实体类加载时进行字节码增强
迈向默认字节码增强脏检查
Hibernate 3一直通过ANT目标提供字节码检测,但是它从未成为主流,大多数Hibernate项目目前仍在使用默认的深度比较方法。
虽然其他JPA提供程序(例如OpenJPA , DataNucleus )一直在支持字节码增强方法,但是Hibernate才刚刚开始朝这个方向发展,提供了更好的构建时选项,甚至提供了自定义的脏检查回调 。
在我的下一篇文章中,我将向您展示如何使用自己的特定于应用程序的策略自定义脏检查机制。
翻译自: https://www.javacodegeeks.com/2014/08/the-anatomy-of-hibernate-dirty-checking.html
Hibernate脏检查的剖析相关推荐
- hibernate自定义_如何自定义Hibernate脏检查机制
hibernate自定义 介绍 在上一篇文章中,我描述了Hibernate自动脏检查机制. 尽管您应该始终喜欢它,但是有时您可能想添加自己的自定义污垢检测策略. 自定义脏检查策略 Hibernate提 ...
- 如何自定义Hibernate脏检查机制
介绍 在上一篇文章中,我描述了Hibernate自动脏检查机制. 尽管您应该始终喜欢它,但是有时您可能想添加自己的自定义污垢检测策略. 自定义脏检查策略 Hibernate提供以下定制机制: 休眠拦截 ...
- hibernate脏数据_Hibernate脏检查的剖析
hibernate脏数据 介绍 持久性上下文使实体状态转换入队 ,该实体状态转换在刷新后转换为数据库语句. 对于托管实体,Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE. ...
- hibernate脏数据_Hibernate性能提示:脏收集效果
hibernate脏数据 在使用Hibernate作为ORM开发服务器和嵌入式应用程序8年后,我全力以赴地寻求提高Hibernate性能的解决方案,阅读博客和参加会议,我决定与您分享在这些年中获得的知 ...
- SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别
SpringDataJPA+Hibernate框架源码剖析系列文章: SpringDataJPA+Hibernate框架源码剖析(一)框架介绍 SpringDataJPA+Hibernate框架源码剖 ...
- 手写AngularJS脏检查机制
什么是脏检查 View -> Model 浏览器提供有User Event触发事件的API,例如,click,change等 Model -> View 浏览器没有数据监测API. Ang ...
- Angular变化检测机制:改善的脏检查
本文链接:https://blog.csdn.net/fen747042796/article/details/75152336 前端展示的页面是由视图和数据共同构成的,视图模板定义了页面的框架,而数 ...
- 前端模式 VD, 脏检查 MVVM ,数据收集 MVVM 所使用的场合
VD 虚拟DOM 数据变化,先修改虚拟DOM层,然后通过虚拟DOM树的对比检查获取出最小的修改量进行对真实DOM树进行修改.虚拟DOM模式只是在DOM层的检查,所以初始渲染速度非常快.在细小修改的大量 ...
- java 实体字段变更记录_java – Hibernate:检查哪个实体的字段被修改
我拥有的: 我有Hibernate实体,它包含许多非瞬态字段,包括集合.用户可以一次更新每个字段或一组字段. 有什么挑战 在处理程序中,我应该检查实体的哪个字段已被更改: public void ...
最新文章
- android measure的时候报空指针
- Ubuntu16.04使用的问题和解决方案集锦
- python正则表达式指南_Python正则表达式指南
- 重载-运算符(感觉怪怪的)
- JSON合并补丁:JSON-P 1.1概述系列
- 美团的DBProxy实践
- P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles(记忆化搜索)--- 89分
- 04-mysql常见命令,语法规范,
- linux 下strstr函数,Linux中strchr与strstr函数实现。
- 渗透测试 2 --- XSS、CSRF、文件上传、文件包含、反序列化漏洞
- 2021-06-24
- C盘满了——扩展C盘内存
- 安卓玩机搞机技巧综合资源-----闲置手机当摄像头 当监控 上网课必备 多软件评测【十四】
- 手机丢了微信聊天记录怎么恢复?别担心,教你一招找回
- 如何通过自媒体创业月入万元
- 淘宝店铺装修代码大全
- 自动监控Oracle 表空间信息并发送邮件脚本
- Onenote插入代码块
- GAN学习:一个简单的GAN搭建
- 嗨聊:移动社交区域化发展的新思路