Алгоритмы HiLo в основном отображают два целых числа в один целочисленный идентификатор. Это гарантирует, что пара чисел будет уникальной для каждой базы данных. Как правило, следующим шагом является обеспечение соответствия уникальной пары чисел уникальному целочисленному идентификатору.
Хорошее объяснение того, как HiLo концептуально работает, дано в предыдущем ответе SO
Изменение max_lo сохранит свойство уникальности пары чисел. Однако обеспечит ли он уникальность сопоставленного идентификатора и отсутствие конфликтов?
Давайте посмотрим на реализацию HiLo в Hibernate. Похоже, что они используют алгоритм (судя по тому, что я собрал): (и я могу не говорить по техническим причинам)
h = high sequence (starting at 0)
l_size = size of low block
l = low sequence (starting at 1)
ID = h*l_size + l
Итак, если ваш младший блок, скажем, 100, ваши зарезервированные блоки идентификаторов будут 1-100, 101-200, 201-300, 301-400 ...
Ваша последовательность High сейчас равна 3. Что бы произошло, если бы вы внезапно изменили свой l_size на 10? Ваш следующий блок, ваш максимум увеличивается, и вы получите 4*10+1 = 41
Ой. Это новое значение определенно попадает в «зарезервированный блок» 1-100
. Кто-то с высокой последовательностью 0 подумает: «Ну, у меня есть диапазон 1-100
, зарезервированный только для меня, поэтому я просто поставлю один на 41
, потому что я знаю, что это безопасно».
Определенно существует очень и очень высокая вероятность столкновения при понижении l_max.
А как насчет обратного случая, подняв его?
Вернемся к нашему примеру, давайте увеличим наш l_size до 500, превратив следующий ключ в 4*500+1 = 2001
, сохранив диапазон 2001–2501.
Похоже, что в этой конкретной реализации HiLo столкновения удастся избежать при повышении вашего l_max.
Конечно, вам следует провести несколько собственных тестов, чтобы убедиться, что это реальная реализация или близкая к ней. Один из способов - установить l_max на 100 и найти несколько первых ключей, затем установить его на 500 и найти следующий. Если произойдет резкий скачок, подобный упомянутому здесь, вы можете быть в безопасности.
Однако я ни в коем случае не предполагаю, что лучше всего поднять l_max в существующей базе данных.
Используйте свое усмотрение; алгоритм HiLo - это не совсем тот, который создан с учетом меняющегося l_max, и ваши результаты могут в конечном итоге быть непредсказуемыми в зависимости от вашей точной реализации. Может быть, кто-нибудь, у кого есть опыт повышения l_max и поиска проблем, сможет доказать, что этот подсчет верен.
Итак, в заключение, хотя теоретически реализация HiLo Hibernate, скорее всего, позволит избежать коллизий при повышении l_max, это, вероятно, все еще не является хорошей практикой. Вы должны кодировать так, как будто l_max не изменится со временем.
Но если тебе повезет ...
person
Justin L.
schedule
21.06.2010