我通过Hibernate在数据库中具有以下结构。我在MySQL上操作。该结构是一个带有简单计数器的表格,该计数器描述了事件(天列)每天发生的频率(计数列)。
@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是否安全?实现触发器或视图并让DBMS处理并发性有意义吗?
我正在考虑的另一个选项是异步数据库写入/更新,但是由于我稍后需要读取此计数器,因此我确实需要保证DBMS已成功进行更新,因此我不确定是否进行异步操作。一个办法。为了澄清起见,如果我向DBMS发送更新命令,我想阅读此更新,但是我不想进行阻塞操作,这可能会降低吞吐量。
在一天结束时,我想执行一个简单的增量操作,保持高吞吐量,避免并发问题,并读取我可能读取的最新计数器。
我对Hibernate还是很陌生,所以如果问题不清楚,我们深表歉意。