当前位置: 首页 > 知识库问答 >
问题:

何时使用EntityManager.clear()?

贺宏富
2023-03-14

自定义JPA映射器类有一个方法:

removeUser()

1. execute 'DELETE' HQL query to remove user
2. call getEntityManager().flush();
3. call getEntityManager().clear();

如果我正确理解clear(),它将从上下文中删除所有持久实体-来源

然而,我也在这里读到,

you should define clear architecture- and design guidelines about where a 
clear() can be called. 

关于何时调用 clear() 的明确准则是什么?

共有3个答案

酆耀
2023-03-14

太长别读:使用EntityManager.clear如果您要执行一组JPA操作,其中您不需要大多数已经加载的实体

我最近遇到了一个性能问题,这促使我询问如何获得额外的日志记录。在我得到答案之前,我发现了如何解决这个问题,这是通过EntityManager.clear()

我将它用于的一个用例是隔离可能密集的操作并加载大量实体供实体管理器管理。在我的例子中,我需要执行授权检查。对于事务剩余部分的大部分业务逻辑,我不需要它会使用的大部分数据(用户配置文件、低级实体访问检查等)。

我发现,即使我不使用它们,它也会在剩余的会话中一直存在,并且最终需要被刷新,即使我的处理已经完成。

通过在刷新发生之前执行清除操作,它会将它们从实体管理器中释放出来,并且不再受管理。

丌官玺
2023-03-14

是的,这完全取决于作为文档点的平台的架构风格。

  • 例如,如果在应用程序中EM与线程关联,那么事务管理的解决方案之一是实现每请求会话模式,该模式在用户请求和提交的每次启动时启动事务

如您所见,这取决于您平台的案例,体系结构和样式。直接针对您的方法 - 刷新和清除每个方法的缓存不是一个好习惯,这是一种反模式方法。

祁权
2023-03-14

文章解释了这一点。清除实体管理器会清空其关联的缓存,从而强制在事务的稍后阶段执行新的数据库查询。在使用事务绑定的实体管理器时,几乎没有必要清除实体管理器。我认为有两个理由需要澄清:

    < li >在进行批处理时,为了避免巨大的高速缓存占用内存并由于长时间的脏检查而增加刷新时间 < li >当您执行完全绕过实体管理器缓存的DML或SQL查询时(如您的示例所示)。在这种情况下,由于查询的原因,缓存保存的状态不能反映数据库中的内容,因此您希望清除缓存以避免这种不一致。
 类似资料:
  • 问题内容: 定制JPA映射器类具有以下方法: 如果我正确理解clear(),它将从上下文中删除所有持久性实体。-资源 但是,我也在这里阅读, 关于何时调用clear()的明确准则是什么? 问题答案: 文章对此进行了解释。清除实体管理器将清空其关联的缓存,从而迫使新的数据库查询在事务中稍后执行。使用事务绑定的实体管理器时,几乎几乎不需要清除实体管理器。我看到有两个原因需要清除: 在进行批处理时,为了

  • 问题内容: 我一直在nodejs中编程,研究了如何同时使用socket.io和对节点服务器的ajax调用。socket.io是否设计为替代ajax?我很好奇,在哪种情况下使用socket.io更好,而哪种ajax更好。感谢您的输入。 问题答案: 好吧,Web套接字(通过socket.io)提供的主要内容之一就是ajax缺乏的是服务器推送。因此,对于ajax,如果您想了解服务器上的新事件(例如,另一

  • 我和我的团队一直在使用Spring boot开发一系列微服务。由于服务经历了JUnit和Spring Boot升级(我们现在使用的是Spring Boot 2和JUnit 5),不同开发人员实现的不同JUnit现在使用不同的模式: @扩展为 今天,它们之间的区别是什么?我们真的需要它们来进行单元测试还是嵌入到一些新的Spring Boot注释中?

  • 问题内容: 我得到了asyncio在Python 3.5 中使用的流程,但是我还没有看到关于我应该使用什么东西,我不应该使用的await东西或者它在哪里容易出现的描述。我是否仅需要根据“这是IO操作并应进行await编辑” 来做出最好的判断? 问题答案: 默认情况下,所有代码都是同步的。你可以使用使其异步定义函数,async def并使用来“调用”这些函数await。一个更正确的问题是“什么时候应

  • 问题内容: 我感觉好像总是被教导要使用s,并且我经常看到它们与s 混合使用,以在应该在不同页面上执行相同操作的几段代码中完成相同类型的查询。开始: 那就是我正在从事的工作: 我看到很多像: 似乎LEFT也可能是INNER,有没有抓住的机会? 问题答案: 有收获吗?是的-左联接是外联接的一种形式,而内联接是内联接的一种形式。 这是显示差异的示例。我们将从基本数据开始: 在这里,我们将看到内部联接和左

  • 我编写jUnit测试用例有3个目的: 确保我的代码满足所有(或大部分)输入组合/值下所需的所有功能。 以确保我可以更改实现,并依靠JUnit测试用例来告诉我,我的所有功能仍然得到满足。 作为我的代码处理的所有用例的文档,并作为重构的规范--如果需要重写代码的话。(重构代码,如果我的jUnit测试失败--您可能错过了一些用例)。 我不明白为什么或者什么时候应该使用。当我看到被调用时,它告诉我,我的j