весенний репозиторий - повторные обновления - PullRequest
0 голосов
/ 28 июня 2018

Я занимаюсь разработкой приложения с использованием Spring Boot и репозиториев Spring JPA.

Логика приложения проста:

  • Получить записи из внешнего сервиса
  • Проверьте, существует ли запись в моей базе данных mysql
  • Если существует, сделать обновление, если нет, вставить

Это работает, но производительность снижается при обработке записей.

Я включил журналы mysql для просмотра входящих запросов и видел множество повторных обновлений.

Записи журнала следуют этому шаблону

  1. много обновлений
  2. другие предложения
  3. те же обновления в (1) и больше обновлений
  4. другие предложения
  5. те же обновления в (3) и больше обновлений

Я использую репозиторий, расширяющий CrudRepository, и я делаю обновления, используя метод repository.save ().

Я пытаюсь сохранить объекты подкласса Event (используя дискриминатор), у этих объектов есть Hashmap, который отображается в столбец JSON в mysql.

Я также заметил, что, если я изменяю только значения в 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());


}

Я никогда не сталкивался с этой проблемой, кто-нибудь может мне помочь?

Заранее спасибо. Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...