十堰论坛网站,连江网站建设,徐州关键字优化公司,做网站后台服务器什么最好我敢打赌#xff0c;每个Java开发人员至少听说过L1#xff08;又名EntityManager或Session#xff09;缓存。 但是您的理解水平足够好吗#xff1f; 如果您不确定#xff0c;请考虑阅读这篇文章。 首先#xff0c;我们需要知道持久性上下文是什么。 根据EntityManager J… 我敢打赌每个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.mergemyEntity方法才能成为主题肮脏的检查 。 但是我没有在代码中调用flush方法所以一切正常 但是您是否调用clear 我也那么认为。 默认的刷新行为是什么 默认情况下JPA刷新提交以及每次查询执行时所做的更改 FlushModeType.AUTO 。 如果将其更改为COMMIT使用em.setFlushModeFlushModeType.COMMIT方法则仅在提交时才会进行刷新顾名思义。 在处理批处理操作时深入了解L1行为尤其重要。 为什么 如果您希望这种操作有效那么我们就必须不时手动刷新更改假设每100次操作。 您知道吗flush不会清除持久性上下文吗 那又如何呢 刷新并不便宜因为它必须处理上下文中的所有实体以查看是否有任何要与数据库同步的对象。 如果您不会在flush之后立即手动清除上下文则每个下一个操作将花费越来越长的时间。 老实说这一次呈指数增长这似乎是记住上述技术的充分理由。 如果您有兴趣深入了解持久性上下文请随时克隆并使用此存储库 其中包含所有描述的案例和示例。 翻译自: https://www.javacodegeeks.com/2017/04/understanding-first-level-jpa-cache.html