首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring实体管理器和Spring数据仓库之间的关系是什么?

Spring实体管理器和Spring数据仓库之间的关系是什么?
EN

Stack Overflow用户
提问于 2018-06-23 14:22:02
回答 1查看 227关注 0票数 0

最近,我遇到了一篇有趣的文章,介绍了如何使用spring存储库在数据库上执行批处理操作-- http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html和我使用分页实现了解决方案。

所有操作都很好,但是我不明白清理实体管理器如何影响在批处理期间数据库上可能发生的其他操作。

  • Spring实体管理器和Spring数据仓库之间的关系是什么?如果我在上执行操作,为什么清除Spring实体管理器会影响使用的内存?
  • 清除Spring实体管理器如何影响批处理过程中可能发生的其他读/写操作?
  • 如何创建Spring实体管理器和Spring数据仓库的专用实例?现在我用的是基本自动装配

@PersistenceContext私有的EntityManager entityManager;@Autowired私有的MyRepository myRepository;

  • 创建用于批处理的Spring实体管理器和Spring数据仓库的单独实例是否有意义?

谢谢你的帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-24 05:06:23

Spring实体管理器和Spring数据仓库之间的关系是什么?如果我在上执行操作,为什么清除Spring实体管理器会影响使用的内存?

Spring JpaRepository具有对EntityManager的引用,并使用它来实现其方法。对于构成JpaRepository的固定方法,您可以在SimpleRepository中找到实现

清除EntityManager如何影响批处理过程中可能发生的其他读/写操作?

EntityManager是一个JPA结构。所有托管引用都连接到一个EntityManager。这样,JPA实现就可以了解实体何时被修改,因此需要保存下一个刷新事件。为了做到这一点,EntityManager必须跟踪它遇到的所有实体。对于典型的web应用程序,这意味着:

  • 你装载了一些实体。
  • 修改它们。
  • 可能添加或删除某些实体
  • 刷新该批次,并在请求结束时关闭EntityManager

因为只涉及几个实体,保存对所有实体的引用并不是什么大问题。

在批处理环境中,事情往往是完全不同的。如果没有特别的思考,自然的事情是:

  1. 你装载了一些实体。
  2. 修改它们。
  3. 可能会添加或删除某些实体。
  4. 重复数千次或数百万次。
  5. 在批处理结束时,刷新批次并关闭EntityManager

因此,您保留了数千甚至数百万次对实体的引用,这些实体在许多情况下不会再被触及。这会给内存带来压力,并且在EntityManager访问其实体引用列表时也会影响性能。这类行动是:

  • 检查每个已加载和持久化的实体是否已在EntityManager中引用
  • 检查哪些实体在刷新事件期间需要保存,并将所有语句按正确的顺序执行。

但是EntityManager和它的第一级缓存(它保存的实体映射)也有好处:实体只加载一次。如果您的批处理一次又一次地引用一些已经存在的实体(典型的“主数据”),那么它不会一次又一次地加载,但每个EntityManager只加载一次。因此,您可能也不希望在每个处理过的行之后刷新您的EntityManager

如何创建Spring实体管理器和Spring数据仓库的专用实例?现在我用的是基本的自动布线。

没有,有一些方法可以创建专用的实例。毕竟,它只是Java代码。但你真的不想这么做。相反,只需使用每个类型生成的sing存储库实例即可。它会被注入一个EntityManager的代理。实际的EntityManager将存在于事务中。并在上面提到的代理内部的事务开始时交换。这是Spring范围魔术的一部分。

您需要做的是用@Transactional对您的方法进行注释,以便事务保持在合理的大小之内。

创建用于批处理的Spring实体管理器和Spring数据仓库的单独实例是否有意义?

不,我想不是这样的。这只会让事情变得复杂。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51002080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档