我正在使用Spring Boot和Spring JPA存储库来开发应用程序。
应用程序逻辑很简单:
这可行,但是随着记录的处理,性能会降低。
我启用了mysql日志来监视传入的查询,并且看到了很多重复的更新。
日志条目遵循此模式
我正在使用扩展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());
}
我从来没有遇到过这个问题,有人可以帮助我吗?
先谢谢了。问候