Переполнение версии с оптимистической блокировкой Hibernate

Я использую спящий режим, и для целей блокировки спящего режима предоставляется столбец версии. Проблема в том, что приложение будет обновлять запись достаточно часто, чтобы предел Java int был достигнут столбцом версии. Возможно, также будет достигнут int предел MySQL.

Есть ли способ вернуть версию к нулю, когда она достигнет любого предела (Java или MySQL)?

Конечно, я могу просто увеличить тип данных до длинного. Но это лишь отсрочивает неизбежное.

Изменить: я погуглил и нашел эту аннотацию: @OptimisticLock (excluded = true). Ссылка: http://bit.ly/nczCx1 Кажется, что теоретически это может работать, но я не смог успешно использовать Это. Кто-нибудь знает, как правильно пользоваться этой аннотацией?


person genkiro    schedule 21.08.2011    source источник
comment
Один из приемов заключается в том, что если вы закрываете приложение и ничто не использует БД (например, если вы проводите какое-то обслуживание приложения или развертываете новую версию), вы можете без всякого риска сбросить все версии обратно до 1.   -  person Augusto    schedule 21.08.2011


Ответы (2)


Хорошо, значит, вы достигли предела целых чисел, достаточно честно. Когда вы увеличиваете его до, скажем, long, вам доступны еще четыре байта. Этого более чем достаточно (конечно, это лишь отсрочивает неизбежное).

Вы можете достичь старого лимита (2 ** 32 обновлений) ровно 2 ** 32 раза, прежде чем он снова начнет переполняться. Предположим, что для такого количества обновлений требуется 1 секунда (я думаю, это заняло у вас больше времени), тогда вам потребуется еще 2 ** 32 секунды (или около 136 лет), чтобы переполнить долгое время.

Но я не знаю, есть ли другое элегантное решение, но если его нет, я бы не стал тратить время на такие детали.

person reto    schedule 21.08.2011
comment
быть очень разборчивым: на самом деле не старый лимит 2 ** 31, поскольку java int имеет 32-битную подпись. Ваша точка зрения по-прежнему полностью актуальна :) - person Gareth Davis; 21.08.2011

@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 обновляются (и сохраняются), версия не увеличивается.

person genkiro    schedule 22.08.2011
comment
-1 Это не решение, поскольку оно отключает оптимистическую блокировку вместо того, чтобы работать над переполнением. - person Andres F.; 15.10.2014