了解一级JPA缓存

我敢打赌,每个Java开发人员至少听说过L1(又名EntityManager或Session)缓存。 但是您的理解水平足够好吗? 如果您不确定,请考虑阅读这篇文章。

首先,我们需要知道持久性上下文是什么。 根据EntityManager JavaDoc,我们知道:

“持久性上下文是一组实体实例,其中对于任何持久性实体标识,都有一个唯一的实体实例。 在持久性上下文中,管理实体实例及其生命周期。”

实际上,第一级缓存与持久性上下文相同。 这意味着诸如persist()merge()remove()之类的操作只会更改上下文中的内部集合,而不会同步到基础数据库。 最重要的是,当您调用clear()方法时会发生什么。 清除L1缓存。 但是我们知道L1 ==持久性上下文。 这是否意味着清除L1会删除所有实体? 实际上是的-所有实体都将被删除,并且永远不会同步到数据库。 这不是秘密,它在文档中指出–” 对实体(…)进行的未经修改的更改将不会同步到数据库。 ”但是谁在乎文档呢? :)

那么它在实践中看起来如何? 看一下下面的代码:

em.persist(myEntity); // saves entity to the context
em.flush(); // triggers insert into database
em.clear(); // removes entity from the context == entity is no longer managed

如果省略flush(),则实体将不会访问数据库。 它仅存在于您的代码中,并且在离开创建该对象的方法之后将丢失。 让我们看下一个示例:

myEntity.setName("old name");
em.persist(myEntity);
em.flush();
em.clear();
myEntity.setName("new name");
em.flush();

完成此代码后, name属性的值是什么? 当然仍然是“旧名称”,因为在调用setName()的那一刻,该实体不再受到管理,并且必须与持久性上下文合并(通过调用em.merge(myEntity)方法)才能成为主题肮脏的检查 。

但是我没有在代码中调用flush()方法,所以一切正常! 但是,您是否调用clear() ? 我也那么认为。 默认的刷新行为是什么? 默认情况下,JPA刷新提交以及每次查询执行时所做的更改( FlushModeType.AUTO) 。 如果将其更改为COMMIT(使用em.setFlushMode(FlushModeType.COMMIT)方法),则仅在提交时才会进行刷新(顾名思义)。

在处理批处理操作时,深入了解L1行为尤其重要。 为什么? 如果您希望这种操作有效,那么我们就必须不时手动刷新更改(假设每100次操作)。 您知道吗,flush()不会清除持久性上下文吗? 那又如何呢? 刷新并不便宜,因为它必须处理上下文中的所有实体,以查看是否有任何要与数据库同步的对象。 如果您不会在flush()之后立即手动清除上下文,则每个下一个操作将花费越来越长的时间。 老实说,这一次呈指数增长,这似乎是记住上述技术的充分理由。

如果您有兴趣深入了解持久性上下文,请随时克隆并使用此存储库 ,其中包含所有描述的案例和示例。

翻译自: https://www.javacodegeeks.com/2017/04/understanding-first-level-jpa-cache.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Eclipse开发Java Web过程中Debug调试的使用方法

这里介绍的是在Eclipse中的Debug调试。首先右击项目选择Debug As -- Debug on Server 或者点击Server面板的小昆虫图标,启动Debug模式。 运行web项目,进行到需要调试的地方,在执行页面操作之前,在即将要运行的代码中添加断点&…

JS-this的使用

做前端开发已经半年之多了,前几天看见apply时心生疑惑,于是查阅了好多资料但还是不太理解,只知道是源于this的问题,今天偶然看到了阮一峰大佬的讲解js中的this问题(http://www.ruanyifeng.com/blog/javascript/&#x…

如何从几何角度上理解方程组只有一个解_深度科普---电磁波(三):无激励下的真空中的Maxwell方程组的解...

很久没有写过与自己专业相关的文章了,于是计划穿插进几篇有关电磁波的深度科普的文章。计划分为几个部分:1. 真空中的 方程组2. 材料中的 方程组和电磁场的边值条件3. 无激励下的真空中的 方程组的解---电磁波(本文章)4. 稳定状态…

matlab figure被图像填充

imgimread(3.jpg);imgrgb2gray(img);figure(1);%figure名字为 Figure 1figure(name,第一);%figure名字为 Figure:第一figure(NumberTitle,off,Name,原图);%figure名字为原图[cols,rows]size(img);set (gcf,Position,[400,300,cols,rows]); %设置figure位置&…

Thread的run()与start()的区别

Java中thread的start()和run()的区别:1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:通过调用Thread类的start()方法来启动一个线程&#xff…

云计算未来趋势预测:AIaaS、无服务器、云端一体化等将成重点?

云计算是一种业务模式,服务提供商在定制的环境中处理客户的完整基础架构和软件需求。随着云计算的发展,云服务和解决方案也将随之增长。 软件即服务(SaaS)预计到2020年将以18%的年均复合增长率增长,平台即服务(PaaS)的采用率将在2020年达到56…

C# list删除 另外list里面的元素_在Python 中 List 操作 9种例子详细了解

list的操作有循环、切片、增、删、改、查、反转、排序;接下来我们逐个来说一下;首先我们要知道,列表的索引(下标)从0开始,最后一个可以用-1表示。1. 循环如果直接for 循环一个list 的时候,那么每…

乱码

程序读入或输出乱码,检查文件的编码方式utf-8或是gbk等;检查程序的解码方式是否与文件的编码方式相同

hadoop矩阵乘法源码_使用Hadoop计算共现矩阵

hadoop矩阵乘法源码这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列。 这次,我们将从文本语料库创建单词共现矩阵。 本系列以前的文章是: 使用MapReduce进行数据密集型文本处理 使用MapReduce进行数据密集型文本处理-本…

第六章 数组和索引器 (6.6 索引器)

【案例】本案例在Student类中定义索引器,然后通过stu[i] 来引用Student类的对象实例。 【案例目的】(1)掌握索引器定义与使用。 (2)理解索引器与属性的区别。 【代码】 namespace Example1 {class Program{static void Main(string[] args){Student stu new Studen…

Java Executors(线程池)

Sun在Java5中,对 Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的…

matlab 小括号

大括号 用于单元阵列的赋值 中括号 用于形成一个向量或矩阵小括号 通常用于一般的算术表达式,指示优先运算,还用于表示函数变量、向量下标和矩阵下标等到 小括号,用于引用数组的元素。 如 X(3)就是X的第三个元素。 X([1 2 3])就是X的头三个元素。 算例:…

如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...

【新智元导读】ICLR 2019一篇论文指出:DNN解决ImageNet时的策略似乎比我们想象的要简单得多。这个发现使我们能够构建更具解释性和透明度的图像分类管道,同时也解释了现代CNN中观察到的一些现象。全文约3300字6图,读完可能需要10分钟CNN非常擅…

【小记】-006--关于高度塌陷的问题

最近遇到一个问题:当使用 position:absolute 时,给父元素添加 position:relative 父元素高度塌陷,此时如何使得父元素的高度被子元素撑开? 我了解到的高度塌陷无非就是:float属性,display:absolute/fixed属性 float与d…

StringBuffer的存在的含义

当我处理旧代码并跨StringBuffer实例运行时,通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势,但我经常在我知道对性能影响不大的地方对其进行更改。 我认为,除了可能带来性能收益外,还应出于各种原因进行更改…

matlab 大括号

大括号,用于cell型的数组的分配或引用。 >> acell(2,1)a [][]>> a(1,1)[2,3,4,0;5,6,7,8];无法从 double 转换为 cell。>> a(1,1){[2,3,4,0;5,6,7,8]};>> a(2,1){str};>> aa [2x4 double]str >>

J2EE项目代码编写规范分享

码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。 代码编写规范使用范围:J2EE项目开发。 包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 servlet类所在包命名规范&am…

Socket套接字 =======================

http://www.cndartlang.com/841.html 转载于:https://www.cnblogs.com/pythonClub/p/10732555.html

matlab 中括号

中括号用来构建向量(Vectors)或者是矩阵(Matrices)。如[6.9 9.64 sqrt(-1)] 就是一个有三个元素的向量。[11 12 13; 21 22 23] 是个2*3的矩阵. 分号(;)用来结束一行。 中括号的另一个作用是在函数中,分配输出参数。 Matlab 方括号“[ ]”的作用 1定义矩阵&#xff…

mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

转载地址:阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了。后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和BTree结构,很少提到我们的集群配…