У меня есть следующая структура в моей базе данных через Hibernate.Я работаю на MySQL.Эта структура представляет собой таблицу с простым счетчиком, описывающим, как часто (столбец count ) происходит событие в день (столбец day ).
@Entity
@Table(name="daily_log")
public class DailyLog {
@Version
@Column(name="opt_lock_v")
protected Integer version;
@Column(name="day")
@Temporal(TemporalType.DATE)
private Date day;
@Column(name="count")
private Integer count;
}
В моем приложенииЯ просто выполняю следующую операцию для приращения:
DailyLog log = dailyLogRepository.findLogEntry(new Date()); // get row by current day
log.setCount(log.getCount() + 1); // increment count by 1
И позже в моем приложении я считываю из базы данных обновленный счетчик, т.е. log.getCount()
.
При высокой нагрузке / высокойутверждение, код, который обновляет счетчик, выдает OptimisticLockException
, что является проблемой из механизма управления версиями Hibernate.
Как можно избежать таких проблем параллелизма?Безопасно ли делегировать управление параллелизмом в MySQL, а не в Hibernate?Имеет ли смысл реализовать триггер или представление и позволить СУБД обрабатывать параллелизм?
Другой вариант, о котором я думал, - это асинхронная запись / обновление базы данных, но, поскольку мне нужно позднее прочитать этот счетчик, мне нужнонекоторые гарантируют, что СУБД успешно произвела обновление, поэтому я не уверен, является ли решение асинхронной операцией.Для пояснения: если я отправлю команду обновления в свою СУБД, я бы хотел прочитать это обновление, но я не хочу выполнять операции блокировки, которые могли бы уменьшить мою пропускную способность.
В концеВ один прекрасный день я хочу выполнить простое увеличение, поддерживать высокую пропускную способность, избежать проблем с параллелизмом и прочитать самый обновленный счетчик, который я только могу прочитать.
Я очень новичок в Hibernate, поэтому извиняюсь, если вопрос не ясен.