【问题标题】:Want to save data into table in database immediately想立即将数据保存到数据库中的表中
【发布时间】:2021-02-17 23:02:51
【问题描述】:

我在使用 Spring Data JPA 存储库将数据保存到数据库时遇到问题。

我的场景:我正在使用循环来一一收集和保存数据。收集所有数据需要花费大量时间。因此,我想将每条记录的数据立即保存到数据库中的表中。我正在使用saveAndFlush 方法,但数据没有立即保存到表中。

我不能等到收集完所有数据,因为收集所有数据可能需要一整天。

【问题讨论】:

  • 看看'spring data batch insert'
  • 让您的交易传播REQUIRES_NEW。这可能会帮助stackoverflow.com/questions/24338150/…
  • 谢谢大家!我从方法中删除了@Transactional,它按我的预期工作

标签: java hibernate jpa spring-data-jpa transactions


【解决方案1】:

我不能 100% 确定您如何测试数据是否不会立即写入数据库,但我猜您正在使用单独的数据库连接进行检查。

这可能意味着您的数据实际上已写入数据库,但未提交,因此对其他会话不可见。

确保事务范围仅在您用于编写的循环内部

为此,包含 for 循环的方法不应有 @Transactional 注释或以任何其他方式包含在事务中,而对 save 的调用是在事务中。 saveAndFlush 不是必需的,因为事务已提交,这无论如何都会触发刷新。

如果调用save 与数据库的唯一交互,Spring 实际上会自动将它包装在一个事务中,因为存储库是开箱即用的@Transactional 注释。否则,您需要使用the transaction support of Spring 来实现此目的。

【讨论】:

  • 是的,我从方法中删除了@Transactional。谢谢你,延斯·肖德!
  • 我很高兴答案有所帮助。表示感谢您提供有用答案的常用方法是对其进行投票(答案左侧的向上箭头)。如果答案确实解决了问题,请考虑使用复选标记将其标记为解决方案。这使其他人可以看到该问题不再需要更多帮助。
【解决方案2】:

也许您的方法有一个 @Transactional 注释,并且它可能会等待所有实体准备好以便在一个事务中一次保存所有实体。

JPA 有一个“saveAll”方法,您可以在其中一次保存整个集合,我建议您使用这个方法,这样您就不必为每个实体发送单独的请求并增加数据库工作负载和网络带宽。

【讨论】:

  • 明确提到 saveAll 不是一个选项
  • 可以加一段代码吗?整个类或至少一个方法
  • 我从方法中删除了@Transactional,它按我的预期工作。谢谢!
【解决方案3】:

我不认为一次保存每条记录是一个好主意,尽管这是可能的。

刷新是将持久化上下文的状态与底层数据库同步的过程。如果发生预期的事情,事务将回滚,不保留任何数据。

针对您的情况的天真的解决方案是使用单独的事务(Propagation.REQUIRES_NEW)。请注意,这会产生巨大的性能消耗。因此,我个人建议在单个事务(批处理)中保存许多记录。 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#batch

因此,无论您在何处使用循环,请确保它在与前一个事务不同的事务中运行。

如果您使用的是 spring-data-jpa,还有更简单的方法可以批量处理实体。你只需要做两件事:

  1. 在您的属性文件中,设置选项spring.jpa.properties.hibernate.jdbc.batch_size=any_size
  2. 将您的存储库的saveAll() 方法与准备插入的实体列表一起使用。 在这里查看更多https://dzone.com/articles/50-best-performance-practices-for-hibernate-5-amp

查看以下图片,了解 REQUIRES_NEWREQUIRED 的工作方式:

AND REQUIRES_NEW

【讨论】:

  • 我从方法中删除了@Transactional,它按我的预期工作。不管怎样,谢谢你的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多