0

我正在使用 spring boot 和 spring JPA 存储库开发应用程序。

应用逻辑很简单:

  • 从外部服务获取记录
  • 检查我的mysql数据库中是否存在记录
  • 如果存在则进行更新,如果不存在则进行插入

这可行,但随着记录的处理,性能会降低。

我启用了 mysql 日志来观察传入的查询,我看到了很多重复的更新。

日志条目遵循此模式

  1. 很多更新
  2. 其他句子
  3. (1) 中的相同更新加上更多更新
  4. 其他句子
  5. (3) 中的相同更新加上更多更新

我使用扩展 CrudRepository 的存储库,我使用 repository.save() 方法进行更新。

我试图保存 Event 子类的对象(使用鉴别器),这些对象具有映射到 mysql 中的 JSON 列的 Hashmap。

我也观察到,如果我只更改 HashMap 中的值(不调用 repository.save() 方法),仍然会调用数据库更新。

这是当我从外部服务获取记录时调用的循环代码:

else if (event.getType().equals(EventType.PAYMENT)) {
 PaymentEvent paymentEvent = (PaymentEvent)event;
 PaymentEvent oldPaymentEvent = eventRepository.getPaymentEvent(paymentEvent.getPaymentId(), paymentEvent.getTimestamp());
 if (oldPaymentEvent == null) {
      // save new event
      eventRepository.save(paymentEvent);
 } else {
      // this method updates the internal Hashmap that maps to JSON Column in Mysql
      oldPaymentEvent.updateCustomPropsFrom(paymentEvent);
      // update old event, if I comment this line database updates are still being triggered (modifying internal hashamp in the line above trigger the udpates)
      eventRepository.save(oldPaymentEvent);
}

这是存储库定义:

public interface EventRepository extends CrudRepository<Event, Long> {
}

最后这是 Hashmap 合并:

public void updateCustomPropsFrom(PaymentEvent event) {
    if (event.getCouponAmount() != null ) {
        this.customProps.put(KEY_COUPON_AMOUNT, event.getCouponAmount());
    }
    if (event.getCurrencyId() != null ) {
        this.customProps.put(KEY_CURRENCY_ID, event.getCurrencyId());
    }
    if (event.getPaymentId() != null ) {
        this.customProps.put(KEY_PAYMENT_ID, event.getPaymentId());
    }
    if (event.getReceivedAmount() != null ) {
        this.customProps.put(KEY_RECEIVED_AMOUNT, event.getReceivedAmount());
    }
    if (event.getPaymentType() != null ) {
        this.customProps.put(KEY_PAYMENT_TYPE, event.getPaymentType());
    }
    if (event.getPaymentReason() != null ) {
        this.customProps.put(KEY_PAYMENT_REASON, event.getPaymentReason());
    }

    if (event.getTimestamp() != null)
        this.setTimestamp(event.getTimestamp());

    if (event.getStoreId()!=null)
        this.setStoreId(event.getStoreId());

    if (event.getUserId()!=null)
        this.setUserId(event.getUserId());

    if (event.getUserId()!=null)
        this.setUserId(event.getUserId());


}

我从来没有遇到过这个问题,有人可以帮助我吗?

提前致谢。问候

4

0 回答 0