【问题标题】:Update millions of database row using Spring Data JPA使用 Spring Data JPA 更新数百万个数据库行
【发布时间】:2020-10-28 07:05:46
【问题描述】:

我想知道哪个最适合这个 这是我的实体:

@Entity
@Data
public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String firstName;
    private String middleName;
    private String lastName;
    private Status status;
    private String statusRemarks;
}

选项 1 在 UserRepository 中直接批量更新:
如果要更新的用户数达到数百万,这会影响我的数据库性能吗?

public interface UserRepository extends CrudRepository<User, Long> {

    @Query("UPDATE u FROM User u set u.status=:status, u.statusRemarks=:statusRemarks where u.status in :statuses")
    void bulkUpdateByStatuses(Status status,String statusRemarks,Status... statuses);
}

选项 2 将按状态获取用户并像这样一一更新:
我很确定这会由于内存使用而影响 MS 的性能

public void bulkUpdateUserByStatuses(final UserBulkUpdateDto userbulkUpdateDto){
        List<User> toUpdateUsers = userRepository.findByStatuses(userbulkUpdateDto.getStatuses())
        for(final User user: toUpdateUsers){
            user.setStatus(userbulkUpdateDto.getNewStatus());
            user.setStatusRemarks(userbulkUpdateDto.getStatusRemarks());

        userRepository.save(user);
        }
    }
}

【问题讨论】:

    标签: spring-boot hibernate jpa spring-data-jpa spring-repositories


    【解决方案1】:

    绝对是选项 1。

    这两个选项都读取受影响的数据,对其进行修改并将其写回。

    上面的选项2通过网络读取和写入数据并将其转换为java对象。

    所以它会更慢,甚至可能会给数据库带来更高的负载。

    如果数据库的负载仍然很高,您应该考虑将更新分成较小的更新,例如一次限制为一个 ID 范围。

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 1970-01-01
      • 2013-12-15
      • 2016-10-21
      • 2011-03-31
      • 2017-08-08
      • 2019-07-24
      • 1970-01-01
      相关资源
      最近更新 更多