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

希望立即将数据保存到数据库的表中

汪和悌
2023-03-14

我面临着使用Spring数据JPA存储库将数据保存到数据库的问题。

我的场景是:我使用循环逐个收集和保存数据。收集所有数据需要很多时间。因此,我想将每个记录的数据立即保存到表中并保存到数据库中。我正在使用saveAndFlush方法,但数据并没有立即保存到表中。

我迫不及待地要收集所有数据,因为收集所有数据可能需要一整天。

共有3个答案

习海
2023-03-14

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

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

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

因此,无论在哪里使用循环,都要确保它在与前一个事务不同的事务中运行。

如果您使用的是spring数据jpa,那么还有更简单的方法来批量处理实体。你只需要做两件事:

  1. 在属性文件中,设置选项“spring”。jpa。属性。冬眠jdbc。批次大小=任意大小

查看以下图片,了解REQUIRES_NEW和REQUIRES如何完成其工作:

并需要_NEW

冀弘厚
2023-03-14

也许您的方法有一个@Transactional注释,也许它等待所有实体准备好以便在一个事务中一次将其全部保存。

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

司空炯
2023-03-14

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

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

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

为此,包含For循环的方法不应具有事务注释或以任何其他方式包括在事务中,而对保存的调用在事务中<代码>saveAndFlush是不必要的,因为事务提交,这将触发刷新。

如果调用保存,与数据库的唯一交互Spring实际上会自动将其包装在事务中,因为存储库是开箱即用的@Transactional注释的。否则您需要使用Spring的事务支持来实现这一点。

 类似资料:
  • 日志: 2021-05-09 14:04:19.356错误22211---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()对于路径[]上下文中的servlet[dispatcherServlet]抛出异常[请求处理失败;嵌套异常为java.lang.NullPointerException:无法调用“c

  • 我正在为我的大学创建一个Android项目,在那里我想用移动指纹传感器制作像指纹考勤系统这样的东西,所以实际上我想把生物特征数据保存到数据库中,以便在考勤时进一步参考。我想将指纹数据保存到移动指纹传感器SQL数据库中。

  • 这是使用PHP将数据从(HTML)表单保存到MySQL数据库的规范问答。 如果您正在尝试执行以下操作,则此操作适用于您: 接受HTML表单上的用户输入 使用PHP脚本处理输入 将所述输入存储到MySQL数据库中。 过去提出的不应使用的类似问题的例子: 连接PHP代码并将表单提交到mySQL数据库 使用PHP/html表单插入mySQL-不工作 如何使用PHP将html表单数据传递到mySQL db

  • 同样地,为需要存储数据的每个JPA实体创建单独的存储库类是否理想?或者有什么更好的方法可以在有限的存储库类的情况下将数据存储到数据库?

  • 问题内容: 我有一个具有表的应用程序,当您单击表中的项目时,它会使用其数据(FieldGroup)填充一组文本字段,然后您可以选择保存更改, 我想知道如何保存更改用户对我的postgres数据库进行的更改 。我正在为此应用程序使用vaadin和hibernate模式。到目前为止,我已经尝试做 我努力了 而且我也尝试过 最后两个给我以下错误 问题答案: 我已经弄清楚了如何对数据库进行更改,下面是一些

  • 我想使用R脚本在数据库中的现有表中输入一个数据帧,我希望数据库中的表有一个顺序主键。我的问题是RODBC似乎不允许主键约束。 下面是创建我想要的表的SQL: 和一个带有R代码的测试: