Я занимаюсь разработкой приложения с использованием Spring Boot и репозиториев Spring JPA.
Логика приложения проста:
- Получить записи из внешнего сервиса
- Проверьте, существует ли запись в моей базе данных mysql
- Если существует, сделать обновление, если нет, вставить
Это работает, но производительность снижается при обработке записей.
Я включил журналы mysql для просмотра входящих запросов и видел множество повторных обновлений.
Записи журнала следуют этому шаблону
- много обновлений
- другие предложения
- те же обновления в (1) и больше обновлений
- другие предложения
- те же обновления в (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());
}
Я никогда не сталкивался с этой проблемой, кто-нибудь может мне помочь?
Заранее спасибо. Привет