我正在使用 spring boot 和 spring JPA 存储库开发应用程序。
应用逻辑很简单:
- 从外部服务获取记录
- 检查我的mysql数据库中是否存在记录
- 如果存在则进行更新,如果不存在则进行插入
这可行,但随着记录的处理,性能会降低。
我启用了 mysql 日志来观察传入的查询,我看到了很多重复的更新。
日志条目遵循此模式
- 很多更新
- 其他句子
- (1) 中的相同更新加上更多更新
- 其他句子
- (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());
}
我从来没有遇到过这个问题,有人可以帮助我吗?
提前致谢。问候