春季仓库-重复更新

时间:2018-06-28 20:23:09

标签: java mysql spring-boot spring-data-jpa

我正在使用Spring Boot和Spring JPA存储库来开发应用程序。

应用程序逻辑很简单:

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

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

我启用了mysql日志来监视传入的查询,并且看到了很多重复的更新。

日志条目遵循此模式

  1. 大量更新
  2. 其他句子
  3. (1)中的相同更新,以及更多更新
  4. 其他句子
  5. (3)中的相同更新,以及更多更新

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

我试图保存Event子类的对象(使用区分符),这些对象具有一个Hashmap,该映射映射到mysql中的JSON列。

我也观察到,如果仅更改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());


}

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

先谢谢了。问候

0 个答案:

没有答案