Hibernate 乐观锁版本溢出问题

3
我正在使用Hibernate,并提供了一个版本列用于Hibernate锁定目的。问题在于应用程序会经常更新条目,以至于版本列达到Java的int限制。MySQL的int限制也可能被达到。
有没有办法使版本一旦达到任何限制(Java或MySQL)就回滚到零?
当然,我可以将数据类型扩大为long。但这只是推迟了不可避免的结果。
编辑:我搜索到这个注释:@OptimisticLock(excluded=true)。链接:http://bit.ly/nczCx1。它似乎在理论上可以工作,但我还没有成功地使用它。有人知道如何正确使用这个注释吗?

2
一个“技巧”是,如果您关闭应用程序并且没有任何东西正在使用数据库(例如,如果您正在对应用程序进行维护或部署新版本),则可以将所有版本重置为1,而不会有任何风险。 - Augusto
3个回答

3

好的,所以你已经达到了整数的限制,很公平。当你将其增加到“long”时,你又有了另外四个可用字节。这已经足够了(当然,它仍然只是推迟了不可避免的事情)。

在开始再次溢出之前,您可以精确地达到旧限制(2 ** 32次更新),并且可以假设需要1秒钟才能进行那么多更新(我猜你需要更长时间),然后需要再花费2 ** 32秒(约136年)才能溢出“long”。

但我不知道是否有不同的优雅解决方案,但如果没有,我不会浪费时间去处理这些细节。


2
有点挑剔:Java int 是32位有符号的,旧限制实际上是2 ** 31。但你的观点仍然完全正确 :) - Gareth Davis

0

@OptimisticLock(excluded=true) 真的很好用!我只是忘记确保将其放在每个更新的属性上。它可以像承诺的那样防止版本号递增。

示例:

@Entity
@Table(name="some_table")
public class SomeEntity extends BaseEntity {
    //... some code

    @Column
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    @OptimisticLock(excluded=true)
    private DateTime lastUsed = new DateTime();

    //... some code
}

这样,即使更新了 lastUsed 属性(并持久化),版本也不会增加。


3
这不是解决方案,因为它禁用乐观锁定而不是解决溢出问题。 - Andres F.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接